如何合并1列上的2列
我想合并2 df的在df1中包含2列和df2 1列,在这种情况下如何应用函数合并?如何合并1列上的2列
下面是示例情况:
df1 <- data.frame(var1=letters[1:5],var2=letters[6:10])
df2 <- data.frame(var3=letters[1:10])
假的尝试:
merge(df1,df2,by.x=c("var1","var2"),by.y="var3",all.y=TRUE)
如何使匹配的搜索使用DF1的两列(VAR1 & VAR2),并运行在合并这两个DF的df2(var3)?
希望的输出:
var1 var2 var3
1 a f a
2 b g b
3 c h c
4 d i d
5 e j e
6 <NA> <NA> f
7 <NA> <NA> g
8 <NA> <NA> h
9 <NA> <NA> i
10 <NA> <NA> j
编辑:改进的数据(希望):
df1 <- data.frame(var1=c(letters[1:5],rep("x",5)),var2=c(letters[6:10],rep("x",5)))
df2 <- data.frame(var3=letters[1:10])
希望的输出:
var1 var2 var3
1 a f a
2 b g b
3 c h c
4 d i d
5 e j e
6 x x f
7 x x g
8 x x h
9 x x i
10 x x j
您可以使用merge
用争论by='row.names'
和sort=F
(由马修Plourde指出)不让merge
乱了顺序:
> merge(df1, df2, by='row.names', sort=FALSE, all=TRUE)[c("var1", "var2", "var3")]
var1 var2 var3
1 a f a
2 b g b
3 c h c
4 d i d
5 e j e
6 <NA> <NA> i
7 <NA> <NA> f
8 <NA> <NA> g
9 <NA> <NA> h
10 <NA> <NA> j
永远不会想到'by = 0'。给'合并''sort = FALSE'参数可以让你完整。 – 2015-02-23 16:07:05
您应该明确说明这是加入行名称。 – 2015-02-23 16:13:18
这里的一个可能data.table
溶液按照第一期望的输出
library(data.table)
setkey(setDT(df2), var3)
df2[df1, `:=`(var1 = i.var1, var2 = i.var2)][]
# var3 var1 var2
# 1: a a f
# 2: b b g
# 3: c c h
# 4: d d i
# 5: e e j
# 6: f NA NA
# 7: g NA NA
# 8: h NA NA
# 9: i NA NA
# 10: j NA NA
你真的只需要根据df1
和cbind
重新排序df2
他们:
cbind(df1, df2[order(match(df2$var3, df1$var1)),, drop=FALSE])
如果df2
有多个列,则不需要drop=FALSE
。
# var1 var2 var3
# 1 a f a
# 2 b g b
# 3 c h c
# 4 d i d
# 5 e j e
# 6 x x f
# 7 x x g
# 8 x x h
# 9 x x i
# 10 x x j
这种方法保持一致,对于没有XS第一个数据集,你可以使用:
cbind(lapply(df1, `length<-`, nrow(df2)), df2[order(match(df2$var3, df1$var1)),, drop=FALSE])
# var1 var2 var3
# 1 a f a
# 2 b g b
# 3 c h c
# 4 d i d
# 5 e j e
# 6 <NA> <NA> f
# 7 <NA> <NA> g
# 8 <NA> <NA> h
# 9 <NA> <NA> i
# 10 <NA> <NA> j
或者在一个更可读的方式:
df1 <- lapply(df1, `length<-`, nrow(df2))
df2 <- df2[order(match(df2$var3, df1$var1)),, drop=FALSE]
cbind(df1, df2)
为第二个数据集('x'),为什么不只是'cbind(df1,df2)'? – user1981275 2015-02-23 15:50:23
假定'df2'已经是有序的,这是OP样本数据的一个属性,但我想象的不是他真实数据的一般属性。 – 2015-02-23 15:51:41
'merge'两次可能会是一种可能的解决方案 – Metrics 2015-02-23 15:28:33
是的,我想过,但可能会混淆我的真实数据。 – Maximilian 2015-02-23 15:30:10
通过凌乱,我的意思是搞乱了数据:)我认为,这可能是相当容易出错 – Maximilian 2015-02-23 15:43:55