如果两个数据框中的前两列匹配

时间:2018-03-01 10:10:24

标签: r for-loop dataframe

我有一个35K点和2列的数据框(d1)。我有第二个数据框(d2),352个点,3列。我一直试图做的是如果d1 $ c1和d1 $ c2等于d2 $ c1和d2 $ c2,那么我想将d2 $ c3的值添加到d1的新列中(比如说d1 $ c3) )。 数据帧d1类似于下面的数据帧。 D2基本上是D1的较小版本,D1具有重复多次的相同值

**D1**
|C1 | C2  |      
|---|:---:|
|1  |1    |
|1  |1    |
|1  |2    |
|2  |1    |
|2  |2    |
|2  |2    |
|2  |2    |
|3  |1    |
|3  |2    |
|3  |3    |
|3  |1    |
|3  |1    |

**D2**

|C1 | C2  | C3  |
|---|:---:|----:|
|1  |1    |a    |
|1  |2    |b    |
|1  |3    |c    | 
|2  |2    |b    |
|3  |1    |c    |   
|3  |2    |a    |
|3  |3    |b    | 

现在我想做的是这个

if((d1$c1 == d2$c1) & (d1$c2 == d2$c2))
{
d1$c3 = d2$c3
}

运行循环后,生成的D1看起来应该与D2中的匹配条目类似,被添加到D1中的新列中

 **D1**
    |C1 | C2  | new C3|      
    |---|:---:|--------
    |1  |1    |a
    |1  |1    |a
    |1  |2    |b
    |2  |1    |a
    |2  |2    |b
    |2  |2    |b
    |2  |2    |b
    |3  |1    |c
    |3  |2    |a
    |3  |3    |b
    |3  |1    |c
    |3  |1    |c

但我最终得到的错误是长度不匹配。

请帮忙。

我试过的代码是

for(i in 1:length(D1$c1))
{
if(((D1$C1 = D2$c1) & (D1$C2 = D2$c2))
{
  D1$c3[i] = D2$c3
}
}

我还尝试使用一列创建一个新数据框,以添加D2

中的值
x = data.frame(length(D1))

for(i in (D1$C1 & D1$C2))
{
  for(j in D2$C1 & D2$C2)
  {
    if(i == j)
    { 
      x = (D2$C3)
              }
  }
}

这两项都没有奏效。

2 个答案:

答案 0 :(得分:0)

希望这有帮助!

library(dplyr)
df1 <- df1 %>%
  left_join(df2, by=c("C1","C2"))

输出是:

   C1 C2   C3
1   1  1    a
2   1  1    a
3   1  2    b
4   2  1 <NA>
5   2  2    b
6   2  2    b
7   2  2    b
8   3  1    c
9   3  2    a
10  3  3    b
11  3  1    c
12  3  1    c

示例数据:

df1 <- structure(list(C1 = c(1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3), C2 = c(1, 
1, 2, 1, 2, 2, 2, 1, 2, 3, 1, 1)), .Names = c("C1", "C2"), class = "data.frame", row.names = c(NA, 
-12L))

df2 <- structure(list(C1 = c(1, 1, 1, 2, 3, 3, 3), C2 = c(1, 2, 3, 2, 
1, 2, 3), C3 = c("a", "b", "c", "b", "c", "a", "b")), .Names = c("C1", 
"C2", "C3"), row.names = c(NA, -7L), class = "data.frame")

答案 1 :(得分:0)

使用基数R,它是合并函数:

set.seed(654321)
d1 <- data.frame(C1=rep(1:3, each=6), C2=sample(3, 6*3, replace=TRUE))
d2 <- data.frame(C1=rep(1:3, 3), C2=rep(1:3, each=3), C3=sample(letters[1:3], 9, replace=TRUE))
merge(d1, d2, by=c("C1", "C2"))