我有两个数据帧
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循环,但是我不知道从哪里开始。
尼科莱塔
答案 0 :(得分:1)
要通过多列合并两个数据帧,可以使用merge
以及相应的by.x
和by.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