我有四个向量如下:
x1=letters[1:5]
x2=c("a","b","c")
x3=c("a","b","c","d")
x4=c("a","b","e")
实际上,我想得到一个这样的数据框:
data.frame(x1,x2=c("a","b","c",NA,NA),
x3=c("a","b","c","d",NA),
x4=c("a","b",NA,NA,"e"))
x1 x2 x3 x4
1 a a a a
2 b b b b
3 c c c <NA>
4 d <NA> d <NA>
5 e <NA> <NA> e
有人可以帮助我或给我一个指标功能吗?
答案 0 :(得分:2)
使用sqldf
从x1加入的解决方案 require(sqldf)
x1 <- data.frame(x1)
x2 <- data.frame(x2)
x3 <- data.frame(x3)
x4 <- data.frame(x4)
x <- sqldf('select x1.x1, x2.x2, x3.x3, x4.x4
from x1
left join x2 on x1.x1 = x2.x2
left join x3 on x1.x1 = x3.x3
left join x4 on x1.x1 = x4.x4
')
答案 1 :(得分:2)
你可以这样做:
ll = list(x1=x1, x2=x2, x3=x3, x4=x4)
x = unique(unlist(ll))
data.frame(lapply(ll, function(y) ifelse(is.element(x,y),x,NA)))
# x1 x2 x3 x4
#1 a a a a
#2 b b b b
#3 c c c <NA>
#4 d <NA> d <NA>
#5 e <NA> <NA> e
或者,这是一个单行:
library(reshape2)
dcast(stack(list(x1=x1, x2=x2, x3=x3, x4=x4)), values~ind, value.var='values')[-1]
答案 2 :(得分:2)
我的“splitstackshape”包中有一个非导出函数charMat
,可能对此类内容很有用。
在这里,我将它与mget
:
## library(splitstackshape) # not required since you'll be using ::: anyway...
data.frame(t(splitstackshape:::charMat(mget(ls(pattern = "x\\d")), mode = "value")))
# X1 X2 X3 X4
# a a a a a
# b b b b b
# c c c c <NA>
# d d <NA> d <NA>
# e e <NA> <NA> e
答案 3 :(得分:1)
这是一个解决方案:
require(zoo)
l<-lapply(list(x1,x2,x3,x4),function(x){zoo(x,x)})
result<-Reduce(merge,l)
colnames(result)<-paste0('x',1:4)
result
# x1 x2 x3 x4
# a a a a a
# b b b b b
# c c c c <NA>
# d d <NA> d <NA>
# e e <NA> <NA> e
此处,lapply
与zoo
结合将创建有序观察列表。 Reduce
将merge
连续应用于列表。最后一步是重命名结果的列。
如果这是您想要的输出,您还可以将result
转换为数据框:
result<-as.data.frame(result)
rownames(result)<-NULL
result
# x1 x2 x3 x4
# 1 a a a a
# 2 b b b b
# 3 c c c <NA>
# 4 d <NA> d <NA>
# 5 e <NA> <NA> e
请注意,如果您有x1
到x20
的向量,则创建list(x1,x2,...)
可能会太长,因此您可以使用sapply(paste0('x',1:4),get)
代替list(x1,x2,x3,x4)
。< / p>