【问题标题】:update a columns in dataframe based on another dataframe using loop使用循环根据另一个数据帧更新数据帧中的列
【发布时间】:2017-03-27 07:16:05
【问题描述】:

这类似于question。但我需要为 1000 个数据帧执行此操作。

我使用以下代码创建了 1000 个数据框:

df <- replicate(1000, sensitivity.score, simplify = FALSE)
names(df) <- paste("score.rand", 1:length(df), sep = "")
list2env(df, envir = .GlobalEnv)

第一个数据框是这样的:

head(score.rand1)
                     Binomial S1 S2 S3 S4 S5 S6   S7   S8   S9
1    Astacoides betsileoensis  H  L  L  L  H  L <NA>    L    L
2        Astacoides caldwelli  H  L  L  L  H  L <NA>    H <NA>
3        Astacoides crosnieri  L  L  L  L  H  L <NA> <NA>    L
4     Astacoides granulimanus  L  L  L  L  H  L    H <NA>    L
5           Astacoides hobbsi  H  L  H  L  H  L <NA> <NA>    L
6 Astacoides madagascariensis  H  L  L  L  H  L <NA> <NA>    L

我使用以下代码创建了另外 1000 个数据框:

mydf <- data.frame(Binomial, S4, S5, S6)
lst <- replicate(1000, mydf[sample(nrow(mydf)),] , simplify = FALSE)
names(lst) <- paste("rand.val", 1:length(lst), sep = "")
list2env(lst , envir = .GlobalEnv)

看起来像这样:

head(rand.val1)
                  Binomial       S4       S5   S6
229  Euastacus girurmulayn 46.63442 3.399884 39.0
168 Distocambarus crockeri 15.76044 6.322875 34.7
235      Euastacus jagabar 46.63442 3.399884 40.6
163        Cherax robustus 44.04395 3.108239 42.5
506  Procambarus ortmannii 88.58447 4.422301 24.0
392    Pacifastacus fortis 30.40509 5.860764 42.0

我需要将“score.rand1”数据帧的 S4、S5、S6 列替换为“rand.val1”数据帧的 S4、S5、S6 列,基于'二项式'。 'score.rand2' by 'rand.val2' ... 'score.rand3' by 'rand.val3' 数据帧...等等对于所有 1000 个数据帧。

【问题讨论】:

  • 您正在寻找merge 函数,类似于merge(score.rand1, rand.val1, by = "Binomial")
  • 谢谢。但是我怎样才能为 1000 个数据帧做到这一点。我曾尝试使用 for 循环但失败了:(
  • 这就是为什么 R 有对象 list 来存储你的 data.frames 然后使用 apply 系列函数处理整个集合。如果您的工作区中有“乱扔”的 data.frames,则必须手动抓取它(使用 ls()),然后使用 get() 检索它们。
  • 在列表上工作真的很容易。为什么要将您的 dfs “取消列出”到 .Global?

标签: r for-loop dataframe


【解决方案1】:

将您的数据集放在两个单独的列表中,然后您可以使用带有 mapply 的合并函数来遍历您的两个数据框列表,从第一个列表中删除冗余列,然后将两者合并在一起,看起来像这样:

combined = mapply(function(rand,score){
    rand$S4 = NULL
    rand$S5 = NULL
    rand$S6 = NULL
    output = merge(x = rand, y = score, by = "Binomial")
}, scores,rand)

【讨论】:

  • 谢谢。现在问题已经解决了。我所做的是:我首先删除了列表“df”中的列表单数据框,然后应用了以下代码:combined.list &lt;- mapply (function (x, y) merge (x, y, by = "Binomial", all = T), x = df, y = lst, SIMPLIFY = F)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 2019-07-10
  • 2016-09-15
  • 2020-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多