如何从数据框'a'分配子集。到数据框的一个子集`b'

时间:2016-03-02 13:04:12

标签: r dataframe subset variable-assignment

这可能是一个微不足道的问题(我是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),即{ {1}}和key。根据{{​​1}},子集由id = n定义。 value如下所示:

n in unique(df$id)

我试图循环数据框,如下所示:

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符合NA的要求。我没有错误,但发出以下警告信息:

  

在&#39; [&lt; - 。factor&#39;(&#39; tmp &#39;,df $ id == i,value = c(NA,:     无效因子水平,NA生成

之前,我使用aux$value,它正常工作,但有些重复df$tag使df$tag <- aux[match(df$tag, aux$key),]$value在多行中产生错位的更新。我也模拟子集,它工作正常。有人可以建议这个更新的解决方案吗?

UPDATE(最终数据集应如何显示?):

df$tags

提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

merge()除非您在aux中有重复项,否则也会有效。

答案 1 :(得分:0)

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

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