2016-03-08 63 views
1

我想使用索引來確定哪些行基於另一個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 

任何解決方案來做到這一點沒有警告?

+0

您可以檢查'DF1 [IDX,]'有隻有兩個行 – akrun

+0

@akrun:感謝您的想法。所以我添加df1 $ D < - NA並運行新代碼。我得到了我想要做的,但是以犧牲警告爲代價。我的意圖是隻包含與索引匹配的數據。 – user2300643

+0

你可以查看'match(df1 $ A,df2 $ A)# [1] 1 2 3'它匹配所有行 – akrun

回答

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]) 
+1

謝謝akrun。從來沒有想過使用相交只在比賽中保持索引。我會盡我所能接受答案。非常感謝。 – user2300643

+0

@ user2434624感謝您的反饋。 – akrun