我想使用索引来确定哪些行基于另一个DF的连接来创建新列。使用索引时,我无法执行match()。使用索引替换值
df1 <- data.frame(A=c("A", "C", "E"), B=c(1, 3, 5))
df2 <- data.frame(A=c("A", "C", "E"), C=c("Z", "X", "V"))
idx <- c(1, 3)
df1[match(df1$A, df2$A), "D"] <- df2$C
> df1
A B D
1 A 1 Z
2 C 3 X
3 E 5 V
df1[idx,][match(df1$A, df2$A), "D"] <- df2$C
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, idx, , value = list(A = c(1L, 3L, NA : replacement element 1 has 3 rows to replace 2 rows
# what I would like the outcome to look like
> df1
A B D
1 A 1 Z
2 C 3 NA
3 E 5 V
更新:akrun给了我的想法,首先扔在一个新的列。我现在得到我想要的,但有警告。
df1$D <- NA
df1[idx,][match(df1$A, df2$A), "D"] <- df2$C
Warning messages:
1: In `[<-.data.frame`(`*tmp*`, idx, , value = list(A = c(1L, 3L, NA :
replacement element 1 has 3 rows to replace 2 rows
2: In `[<-.data.frame`(`*tmp*`, idx, , value = list(A = c(1L, 3L, NA :
replacement element 2 has 3 rows to replace 2 rows
3: In `[<-.data.frame`(`*tmp*`, idx, , value = list(A = c(1L, 3L, NA :
replacement element 3 has 3 rows to replace 2 rows
> df1
A B D
1 A 1 3
2 C 3 NA
3 E 5 2
任何解决方案来做到这一点没有警告?
您可以检查'DF1 [IDX,]'有只有两个行 – akrun
@akrun:感谢您的想法。所以我添加df1 $ D < - NA并运行新代码。我得到了我想要做的,但是以牺牲警告为代价。我的意图是只包含与索引匹配的数据。 – user2300643
你可以查看'match(df1 $ A,df2 $ A)# [1] 1 2 3'它匹配所有行 – akrun