我有一个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)
}
}
}
这两项都没有奏效。
答案 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"))