如何将包含不同长度矢量的列表转换为R中的可用数据帧?

Ico*_*Ico 46 r vector dataframe

我有一个(相当长的)矢量列表.这些向量由我使用strsplit()句子函数得到的俄语单词组成.

以下是head()返回的内容:

[[1]]
[1] "?????"     "?????????" "??????"    "?"         "????"     

[[2]]
[1] "??"        "?????????" "????????"  "?"         "?????"    

[[3]]
[1] "?????"            "????????"         "??????-?????????" "?"                "??????????"       "???????"         

[[4]]
[1] "?????" "??"    "????," "???"   "??"   

[[5]]
[1] "????????????," "?"             "?????????"     "??"            "?????"        

[[6]]
[1] "??????"     "??????????" "???."
Run Code Online (Sandbox Code Playgroud)

注意,矢量具有不同的长度.

我想要的是能够阅读每个句子,第二个单词,第三个单词等的第一个单词.

期望的结果将是这样的:

    P1              P2           P3                 P4    P5           P6
[1] "?????"         "?????????"  "??????"           "?"   "????"       NA
[2] "??"            "?????????"  "????????"         "?"   "?????"      NA
[3] "?????"         "????????"   "??????-?????????" "?"   "??????????" "???????"         
[4] "?????"         "??"         "????,"            "???" "??"         NA
[5] "????????????," "?"          "?????????"        "??"  "?????"      NA
[6] "??????"        "??????????" "???."             NA    NA           NA
Run Code Online (Sandbox Code Playgroud)

我试图使用,data.frame()但由于行的长度不同而无效.我也试过rbind.fill()了这个plyr包,但是这个函数只能处理矩阵.

我在这里找到了一些其他问题(这是我得到plyr帮助的地方),但这些都是关于组合两个不同大小的数据帧.

谢谢你的帮助.

Ram*_*ath 79

一个班轮用 plyr

plyr::ldply(word.list, rbind)
Run Code Online (Sandbox Code Playgroud)

  • 自从“plyr”退役以来,有任何“dplyr”等价物吗? (2认同)

adi*_*der 39

试试这个:

word.list <- list(letters[1:4], letters[1:5], letters[1:2], letters[1:6])
n.obs <- sapply(word.list, length)
seq.max <- seq_len(max(n.obs))
mat <- t(sapply(word.list, "[", i = seq.max))
Run Code Online (Sandbox Code Playgroud)

诀窍是,那,

c(1:2)[1:4]
Run Code Online (Sandbox Code Playgroud)

返回向量+两个NA

  • 这可以通过以下方式进一步浓缩为一行:`sapply(word.list,'[',seq(max(sapply(word.list,length))))`(如图所示[**here**](http: //stackoverflow.com/questions/5531471/combining-unequal-columns-in-r)) (9认同)
  • 对于那些使用@ Arun的单行解决方案的人来说,请注意必须有一个转置`t()`来创建适当的列,就像在原始问题中一样. (3认同)
  • 现在,`sapply(word.list, length)`可以重写为`lengths(word.list)`。 (2认同)

akr*_*run 13

另一种选择是stri_list2matrix来自library(stringi)

library(stringi)
stri_list2matrix(l, byrow=TRUE)
#    [,1] [,2] [,3] [,4]
#[1,] "a"  "b"  "c"  NA  
#[2,] "a2" "b2" NA   NA  
#[3,] "a3" "b3" "c3" "d3"
Run Code Online (Sandbox Code Playgroud)

注意:来自@ juba的帖子的数据.

或者@Valentin在评论中提到

sapply(l, "length<-", max(lengths(l)))
Run Code Online (Sandbox Code Playgroud)

  • 我认为 [here](/sf/ask/2352933621/ data-frame-i#answer-33622855) 也值得一提:`sapply(l, "length&lt;-", max(lengths(l)))` (3认同)

jub*_*uba 12

你可以这样做:

## Example data
l <- list(c("a","b","c"), c("a2","b2"), c("a3","b3","c3","d3"))
## Compute maximum length
max.length <- max(sapply(l, length))
## Add NA values to list elements
l <- lapply(l, function(v) { c(v, rep(NA, max.length-length(v)))})
## Rbind
do.call(rbind, l)
Run Code Online (Sandbox Code Playgroud)

这使 :

     [,1] [,2] [,3] [,4]
[1,] "a"  "b"  "c"  NA  
[2,] "a2" "b2" NA   NA  
[3,] "a3" "b3" "c3" "d3"
Run Code Online (Sandbox Code Playgroud)


and*_*har 8

您也可以rbindlist()data.table包中使用。

将向量转换为data.tables 或data.frames 并在lapply(). 然后将它们绑定rbindlist()- 用 NA 填充缺失的单元格。

require(data.table)

l = list(c("a","b","c"), c("a2","b2"), c("a3","b3","c3","d3"))
dt = rbindlist(
  lapply(l, function(x) data.table(t(x))),
  fill = TRUE
)
Run Code Online (Sandbox Code Playgroud)