2017-08-25 183 views
0

更新值我有一個old_df看起來像通過匹配名稱

old_df <- data.frame(Name = c("A", "A","A","B", "B", "C", "D", "E", "E"), 
      Value = c(1, 1, 1, 2, 2, 3, 4, 5, 5)) 

而且我想在新的數據保留名稱不能用新的更新後的值更新此old_df。

new <- data.frame(Name = c("A", "E",), 
      Value = c(100, 500)) 

新輸出會看起來像

A 100 
A 100 
A 100 
B 2 
B 2 
C 3 
D 4 
E 500 
E 500 

回答

2

您可以使用match和替換NA從無與倫比的值返回與舊的價值觀,即

old_df$new_val <- new$Value[match(old_df$Name, new$Name)] 
old_df$new_val[is.na(old_df$new_val)] <- old_df$Value[is.na(old_df$new_val)] 

或者使用dplyr

library(dplyr) 

old_df %>% 
left_join(new, by = 'Name') %>% 
mutate(Value.y = replace(Value.y, is.na(Value.y), Value.x[is.na(Value.y)])) 

兩個捐贈,

Name Value new_val 
1 A  1  100 
2 A  1  100 
3 A  1  100 
4 B  2  2 
5 B  2  2 
6 C  3  3 
7 D  4  4 
8 E  5  500 
9 E  5  500 
1

另一種選擇是使用帶有加入data.table

library(data.table) 
setDT(old_df)[new, Value := i.Value, on = .(Name)] 
old_df 
# Name Value 
#1: A 100 
#2: A 100 
#3: A 100 
#4: B  2 
#5: B  2 
#6: C  3 
#7: D  4 
#8: E 500 
#9: E 500