如何将数据框“a”的子集分配给数据框“b”的子集

How to assign a subset from a data frame `a' to a subset of data frame `b'

这可能是一个微不足道的问题(我是 R 的新手),但我找不到我的问题的答案,无论是在 SO 中还是在其他任何地方。我的情况如下。

我有一个数据框 df,我想更新一个子集 df$tag 值。 df 类似于以下内容:

id = rep( c(1:4), 3)
tag = rep( c("aaa", "bbb", "rrr", "fff"), 3)
df = data.frame(id, tag)

然后,我尝试使用 match() 从数据框的子集中更新列 tag,使用包含两列的第二个数据框(例如 aux),即, keyvalue。根据 n in unique(df$id),子集由 id = n 定义。 aux 如下所示:

 > aux 
     key      value
   "aaa"  "valueAA"
   "bbb"  "valueBB"
   "rrr"  "valueRR"
   "fff"  "valueFF"

我试过遍历数据框,如下:

for(i in unique(df$id)){
   indexer = df$id == i

   # here is how I tried to update the dame frame:
   df[indexer,]$tag <- aux[match(df[indexer,]$tag, aux$key),]$value
}

预期 结果是 df[indexer,]$tag 使用 aux$value 中的相应值进行了更新。 实际 结果 df$tag 满足 NA。我没有遇到任何错误,但出现以下警告消息:

In '[<-.factor'('tmp', df$id == i, value = c(NA, : invalid factor level, NA generated

之前,我使用的是 df$tag <- aux[match(df$tag, aux$key),]$value,它工作正常,但是一些重复的 df$tags 使 match() 在许多行中产生错位的更新。我还模拟了子集化并且工作正常。有人可以为此更新提出解决方案吗?

更新(最终数据集应该是什么样子?):

 > df
      id       tag
       1  "valueAA"
       2  "valueBB"
       3  "valueRR"
       4  "valueFF"
    (...)     (...)

提前谢谢你。

这会产生您期望的输出吗?

df$tag <- aux$value[match(df$tag, aux$key)]

merge() 也可以,除非您在 aux 中有重复项。

事实证明,我的数据破坏了所有可用的 内置 函数,最终为我提供了错误的数据集。然后,我的解决方案(至少是初步的)如下:

  1. 单独处理每个子集;
  2. 将每个数据框添加到列表中;
  3. 使用 rbindlist(a.list, use.names = T) 获得包含结果的完整数据框。