2017-08-25 177 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