使用索引[R]替换值

时间:2016-03-08 17:51:59

标签: r

我正在尝试使用索引来根据另一个DF的连接来识别要创建新列的行。使用索引时我无法进行匹配()。

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

任何解决方案都可以在没有警告的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

可能我们可以试试

df1[intersect(idx,match(df1$A, df2$A)), "D"] <- as.character(df2$C[idx])
df1
#  A B    D
#1 A 1    Z
#2 C 3 <NA>
#3 E 5    V

或者稍微简洁的选项(基于示例)将是

df1[match(df1$A, df2$A)[idx], "D"] <- as.character(df2$C[idx])