R:如果两个数据帧的两列的值相等,则将两个数据帧之一的列相加

时间:2020-01-24 13:46:09

标签: r merge data-cleaning

我有两个数据帧

columns df1= a, b, c, d

columns df2= e, f, c, d

我想说的是,如果df1$a == df2$e同时又df1$b == df2$f,我想在新列df1$x中打印相应的df2$c的值。

所以我写了这个命令df1$x <- ifelse(df1$a %in% df2$e & df1$b %in% df2$f, df2$c, ifelse (NULL))

但是df1x中的值不正确。我想我必须做一个while循环,但是我不知道从哪里开始。

尼科莱塔

1 个答案:

答案 0 :(得分:1)

要通过多列合并两个数据帧,可以使用merge以及相应的by.xby.y。这两个都接受列名的向量。参数all.x表示将保留前df1中的所有数据。

df1 <-  merge(df1, df2[,c("e","f","c")], by.x=c("a","b"), by.y=c("e","f"), all.x=T)

colnames(df1) <- c("a","b","c","d","x")

有关更多信息,请参见?merge。对于更复杂的操作,您可以检出软件包dplyr及其功能left_join

随机数据结果

df1 <- data.frame(a = sample(1:5), b= sample(1:5), c=runif(5), d = runif(5))
df2 <- data.frame(e = df1$a, f = df1$b, c = runif(5), d = runif(5))
df2$e[3] <- 7

输出

> df1
  a b          c          d
1 5 4 0.76677063 0.92123552
2 4 1 0.93524320 0.09275425
3 3 2 0.01121468 0.12035981
4 1 5 0.72992427 0.87711572
5 2 3 0.11680937 0.93696597
> df2$e[3] <- 7
> df2
  e f         c         d
1 5 4 0.6251662 0.1549575
2 4 1 0.8464672 0.8702837
3 7 2 0.5394273 0.4290171
4 1 5 0.4061817 0.9072905
5 2 3 0.3376456 0.4291463
> merge(df1, df2[,c("e","f","c")], by.x=c("a","b"), by.y=c("e","f"), all.x=T)
  a b          c          d         x
1 1 5 0.72992427 0.87711572 0.4061817
2 2 3 0.11680937 0.93696597 0.3376456
3 3 2 0.01121468 0.12035981        NA
4 4 1 0.93524320 0.09275425 0.8464672
5 5 4 0.76677063 0.92123552 0.6251662