如何将数据框“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),即, key
和 value
。根据 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
中有重复项。
事实证明,我的数据破坏了所有可用的 内置 函数,最终为我提供了错误的数据集。然后,我的解决方案(至少是初步的)如下:
- 单独处理每个子集;
- 将每个数据框添加到列表中;
- 使用
rbindlist(a.list, use.names = T)
获得包含结果的完整数据框。
这可能是一个微不足道的问题(我是 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),即, key
和 value
。根据 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
中有重复项。
事实证明,我的数据破坏了所有可用的 内置 函数,最终为我提供了错误的数据集。然后,我的解决方案(至少是初步的)如下:
- 单独处理每个子集;
- 将每个数据框添加到列表中;
- 使用
rbindlist(a.list, use.names = T)
获得包含结果的完整数据框。