R - 取消列入数据帧

时间:2017-02-09 22:55:21

标签: r vector dataframe

我在R中有一个向量列表:

[[1]]
[1] 1 2 3 4

[[2]]
[1] 7 9 1 4

[[3]]
[1] 8 2 1

[[4]]
[1] 8 9 0 7

我想从中提出dataframe。问题是,我不能简单地使用unlist然后重新组织,因为并非所有向量都是相同的长度 - 当发生这种情况时我想在我的数据帧中使用NA。最终结果应如下所示:

Col1  Col2  Col3  Col4
1     2     3     4
7     9     1     4
8     2     1     NA
8     9     0     7

有办法做到这一点吗?

4 个答案:

答案 0 :(得分:2)

使用purrr,您可以执行以下操作:

require(purrr)
L <- list(1:4, c(7,9,1,4), c(8,2,1), c(8,9,0,7))
map_df(L, ~as.data.frame(t(.)))

这给了你:

  V1 V2 V3 V4
1  1  2  3  4
2  7  9  1  4
3  8  2  1 NA
4  8  9  0  7

基地R方法:

clen <- vapply(L, length, integer(1))
mat <- matrix(NA, nrow = length(L), ncol = max(clen))
for(i in seq_along(L)){
  mat[i, seq(1, clen[i])] <- L[[i]]
}
as.data.frame(mat)

答案 1 :(得分:1)

在基数R中尝试此操作(其中ls是您的列表对象):

data.frame(t(sapply(ls, function(x) x[1:max(lengths(ls))])))

根据您的数据给出的信息:

#  X1 X2 X3 X4
#1  1  2  3  4
#2  7  9  1  4
#3  8  2  1 NA
#4  8  9  0  7

一般来说,c(1:5)[1:7]会给你

#[1]  1  2  3  4  5 NA NA

答案 2 :(得分:1)

cbind.ts可以处理不同长度的对象。使用它我们可以获得以下一个行基础解决方案:

as.data.frame(t(unname(do.call("cbind", lapply(L, ts)))))

,并提供:

  V1 V2 V3 V4
1  1  2  3  4
2  7  9  1  4
3  8  2  1 NA
4  8  9  0  7

这可以替代地表示为magrittr管道:

library(magrittr)

L %>% 
  lapply(ts) %>% 
  do.call(what = "cbind") %>% 
  t %>% 
  unname %>% 
  as.data.frame

注意:我们将此作为输入:

L <- list(1:4, c(7, 9, 1, 4), c(8, 2, 1), c(8, 9, 0, 7))

答案 3 :(得分:0)

我们可以使用stri_list2matrix中的stringi并从mode转换为characterinteger

library(stringi)
m1 <- stri_list2matrix(L, byrow=TRUE)
mode(m1) <- "integer"
m1
#      [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    7    9    1    4
#[3,]    8    2    1   NA
#[4,]    8    9    0    7

matrix可以data.frame转换为as.data.frame

as.data.frame(m1)

数据

L <- list(1:4, c(7, 9, 1, 4), c(8, 2, 1), c(8, 9, 0, 7))