首页 > 解决方案 > 根据几个条件替换 df 中的某些值

问题描述

基本问题,但我正在寻找一个很好的解决方案(不是循环),如果满足几个条件,则通过 DF2 的值在 DF1 中进行条件替换:

DF1
Name  Year   Val1
A    2010     x1
A    2012     x2
B    2012     x3
C    2015     x4
C    2012     x5
DF2
Name  Year   Val1
A    2012     y1
B    2012     y2
C    2012     y3

如果 Year 具有特定值,例如在这种情况下为 2012,并且 DF1 和 DF2 的名称相同,则将 Val1 从 DF2 分配给 DF1。

我尝试了几件事: DF1$Val1[DF1$Year=="2012"&DF1$Name==DF2$Name,] <-DF2$Val1 DF1$Val1<-replace(DF1$Val1, DF1$Year=="2012" & DF1$Name==DF2$Name, DF2$Val1)

但不幸的是,我收到了一个错误,因为 DF1 和 DF2 的长度不同。

预期的:

DF1
Name  Year   Val1
A    2010     x1
A    2012     y1
B    2012     y2
C    2015     x4
C    2012     y3

谢谢您的帮助!

标签: rdatabasemerge

解决方案


我们可以使用加入ondata.table并更新“Val”

librar(data.table)
setDT(DF1)[DF2, Val1 := i.Val1, on = .(Name, Year)]
DF1
#   Name Year Val1
#1:    A 2010   x1
#2:    A 2012   y1
#3:    B 2012   y2
#4:    C 2015   x4
#5:    C 2012   y3

数据

DF1 <- structure(list(Name = c("A", "A", "B", "C", "C"), Year = c(2010L, 
2012L, 2012L, 2015L, 2012L), Val1 = c("x1", "x2", "x3", "x4", 
"x5")), class = "data.frame", row.names = c(NA, -5L))

DF2 <- structure(list(Name = c("A", "B", "C"), Year = c(2012L, 2012L, 
2012L), Val1 = c("y1", "y2", "y3")), class = "data.frame", row.names = c(NA, 
-3L))

推荐阅读