将不同长度的向量组合到R中的数据帧中

将不同长度的向量组合到R中的数据帧中,r,R,我有四个向量,如下所示: 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

我有四个向量,如下所示:

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
数据帧(x1,x2=c(“a”,“b”,“c”,NA,NA),
x3=c(“a”、“b”、“c”、“d”、NA),
x4=c(“a”,“b”,NA,NA,“e”))
x1x2x3x4
a
2b
3C
四维
5 e e
有人能帮我或给我一个函数作为指示器吗?

这里有一个解决方案:

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   

请注意,如果您有向量
x1
x20
,那么创建
列表(x1,x2,…)
可能太长,因此您可以使用
sapply(粘贴0('x',1:4),get)
而不是
列表(x1,x2,x3,x4)
使用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
               ')
require(sqldf)
x1您可以执行以下操作:

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

在我的“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
##库(splitstackshape)#不是必需的,因为您将使用:::无论如何。。。
data.frame(t(splitstackshape:::charMat(mget(ls(pattern=“x\\d”)),mode=“value”))
#x1x2x3x4
#a
#b b b b b
#c c c c c
#d
#e e e

非常感谢,您的回答让我想起了一些关于sql的操作。感谢您让我了解了“mget”和“splitstackshape”包。我正在学习mget的使用。还有一个问题:为什么我需要使用
splitstackshape:::charMat(mget(ls(pattern=“x\\d”)、mode=“value”)
charMat(mget(ls(pattern=“x\\d”)),mode=“value”)
告诉我“错误:找不到函数“charMat”?我正在使用Win8.1 64,R3.2.1我第一次听说了
splitstackshape
包,
不导出函数
,这意味着你应该使用
splitstackshape:::charMat
不直接调用它?@chunjin,是的。这意味着不应该直接调用它,而是使用
::
调用
sapply(paste0('x',1:4),get)
应该等于
mget(ls(pattern=“x\\d”)
,谢谢你的帮助,我学到了很多。@chunjin:事实上,我忘了
mget
这是我在stackoverflow上提出的第一个问题,太激动了,你们很多人都能帮我解决这个问题,谢谢。我投票了,因为我是stackoverflow的新手,投票结果只有在我得到15分后才能显示
library(reshape2)
dcast(stack(list(x1=x1, x2=x2, x3=x3, x4=x4)), values~ind, value.var='values')[-1]
## 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