这可能是一个微不足道的问题(我是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
提前谢谢。
答案 0 :(得分:0)
这会产生您期望的输出吗?
df$tag <- aux$value[match(df$tag, aux$key)]
merge()
除非您在aux
中有重复项,否则也会有效。
答案 1 :(得分:0)
事实证明,我的数据打破了所有可用的内置功能,最终为我提供了错误的数据集。然后,我的解决方案(至少是初步的解决方案)如下:
rbindlist(a.list, use.names = T)
获取包含结果的完整数据框。