如果满足多个条件,则将值从一个 Dataframe 复制到另一个 Dataframe (R)

t98cgbkg  于 2022-12-06  发布在  其他
关注(0)|答案(2)|浏览(157)

我有两个 Dataframe :

DF1<-data.frame(VAR1 = c(1,1,1,1,2,2,2,2,3,3,3,3),
VAR2 = c('John','Bob','Hannah'), VAR3 = c(1,1,1,2),
VAR4=NA)

DF2<-data.frame(VAR1 = c(1,1,1,1,2,2,2,2,3,3,3,3), 
VAR2 = c('John','Bob','Hannah','Dave'),
VAR4 = c('A','B','C'))

我想将DF2$VAR4复制到DF1$VAR4中,对于条件如果满足(DF1$VAR1==DF2$VAR1)&(DF1$VAR2==DF2$VAR2),则无论DF1$VAR3取什么值,DF2$VAR4中的每一对(VAR1,VAR2)都只有一个元素,而DF1没有。事实上,DF1$VAR3计算每一对(DF1$VAR1,DF1$VAR2)出现的次数。
我试着(从另一个主题)

DF3<-merge(DF1, DF2[,'VAR4'], by= c('VAR1','VAR2'))

这应该能解决问题,但我得到的是“fix.by(by.y,y)中得错误:”by“必须指定唯一有效得列”
我检查了很多次,但是没有拼写错误,VAR1和VAR2都存在于两个 Dataframe 中,并且方向一致。我不知道我在这里错过了什么。
我对R语法非常陌生,所以我用嵌套循环解决了它:

for (i in DF1$VAR1){
  for (j in DF1$VAR2[DF1$VAR1==i]){
    DF1$VAR4[DF1$VAR1==i & DF1$VAR2==j] <- DF2$VAR4[DF2$VAR1==i & DF2$VAR2==j]
  }
}

这个方法很好用,但是非常慢。我很确定这个解决方案很简单,但是我就是不能解决它。非常感谢你的时间

xfb7svmp

xfb7svmp1#

我们可以从dplyr使用rows_update(实验):

library(dplyr)

DF1 |>
  rows_update(DF2, by = c("VAR1", "VAR2"), unmatched = "ignore")

输出量:

VAR1   VAR2 VAR3 VAR4
1     1   John    1    A
2     1    Bob    1    B
3     1 Hannah    1    C
4     1   John    2    A
5     2    Bob    1    C
6     2 Hannah    1    A
7     2   John    1    B
8     2    Bob    2    C
9     3 Hannah    1    B
10    3   John    1    C
11    3    Bob    1    A
12    3 Hannah    2    B
lo8azlld

lo8azlld2#

您可以使用left_join:

library(dplyr) 

DF1<-data.frame(VAR1 = c(1,1,1,1,2,2,2,2,3,3,3,3),
                VAR2 = c('John','Bob','Hannah'), VAR3 = c(1,1,1,2),
                VAR4=NA)

DF2<-data.frame(VAR1 = c(1,1,1,1,2,2,2,2,3,3,3,3), 
                VAR2 = c('John','Bob','Hannah','Dave'),
                VAR4 = c('A','B','C'))

DF3<-left_join(DF1, DF2, by= c('VAR1','VAR2'))%>%
   mutate(VAR4=VAR4.y)%>%
   select(-c(VAR4.x,VAR4.y))
DF3
# > DF3
# VAR1   VAR2 VAR3 VAR4
# 1     1   John    1    A
# 2     1    Bob    1    B
# 3     1 Hannah    1    C
# 4     1   John    2    A
# 5     2    Bob    1    C
# 6     2 Hannah    1    A
# 7     2   John    1    B
# 8     2    Bob    2    C
# 9     3 Hannah    1    B
# 10    3   John    1    C
# 11    3    Bob    1    A
# 12    3 Hannah    2    B

相关问题