如何在R中将由不同长度的向量组成的列表转换为可用的 Dataframe ?

e3bfsja2  于 2023-06-19  发布在  其他
关注(0)|答案(7)|浏览(121)

我有一个(相当长的)向量列表。这些向量由我通过对句子使用strsplit()函数获得的俄语单词组成。
以下是head()返回的内容:

[[1]]
[1] "модно"     "создавать" "резюме"    "в"         "виде"     

[[2]]
[1] "ты"        "начианешь" "работать"  "с"         "этими"    

[[3]]
[1] "модно"            "называть"         "блогер-рилейшенз" "―"                "начинается"       "задолго"         

[[4]]
[1] "видел" "по"    "сыну," "что"   "он"   

[[5]]
[1] "четырнадцать," "я"             "поселился"     "на"            "улице"        

[[6]]
[1] "широко"     "продолжали" "род."

注意,向量具有不同的长度。
我想要的是能够从每个句子中读出第一个单词,第二个单词,第三个等等
期望的结果将是这样的:

P1              P2           P3                 P4    P5           P6
[1] "модно"         "создавать"  "резюме"           "в"   "виде"       NA
[2] "ты"            "начианешь"  "работать"         "с"   "этими"      NA
[3] "модно"         "называть"   "блогер-рилейшенз" "―"   "начинается" "задолго"         
[4] "видел"         "по"         "сыну,"            "что" "он"         NA
[5] "четырнадцать," "я"          "поселился"        "на"  "улице"      NA
[6] "широко"        "продолжали" "род."             NA    NA           NA

我试过只使用data.frame(),但这不起作用,因为行的长度不同。我还尝试了plyr包中的rbind.fill(),但该函数只能处理矩阵。
我在这里发现了一些其他问题(这就是我得到plyr帮助的地方),但这些问题都是关于组合两个不同大小的 Dataframe 的。
谢谢你的帮助

uubf1zoe

uubf1zoe1#

一个内衬,带plyr

plyr::ldply(word.list, rbind)
gudnpqoy

gudnpqoy2#

试试这个:

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))

诀窍在于

c(1:2)[1:4]

返回向量+两个NA

lxkprmvk

lxkprmvk3#

另一个选项是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"

注:数据来自@juba的帖子。
或者正如@Valentin在评论中提到的

sapply(l, "length<-", max(lengths(l)))

或使用tidyverse

library(purrr)
library(tidyr)
library(dplyr)
tibble(V = l) %>% 
   unnest_wider(V, names_sep = "")
# A tibble: 3 × 4
  V1    V2    V3    V4   
  <chr> <chr> <chr> <chr>
1 a     b     c     <NA> 
2 a2    b2    <NA>  <NA> 
3 a3    b3    c3    d3
jei2mxaa

jei2mxaa4#

你可以这样做:

## 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)

其给出:

[,1] [,2] [,3] [,4]
[1,] "a"  "b"  "c"  NA  
[2,] "a2" "b2" NA   NA  
[3,] "a3" "b3" "c3" "d3"
qmelpv7a

qmelpv7a5#

您也可以使用data.table包中的rbindlist()
将向量转换为data.table s或data.frame s,并在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
)
yuvru6vn

yuvru6vn6#

由于问题是将list转换为data.frame,因此可以将所有列表向量的最大长度设置为max(lengths(L)),并在lapply中使用length<-,然后使用list2DF将此列表转换为data.frame

L <- list(a=1, b=2:3, c=3:5)

list2DF(lapply(L, `length<-`, max(lengths(L))))
#   a  b c
#1  1  2 3
#2 NA  3 4
#3 NA NA 5
66bbxpm5

66bbxpm57#

另一种选择是定义一个类似于这样的函数(它模仿rbind.fill),或者直接从rowr包中使用它:

cbind.fill <- function(...){
  nm <- list(...) 
  nm <- lapply(nm, as.matrix)
  n <- max(sapply(nm, nrow)) 
  do.call(cbind, lapply(nm, function (x) 
    rbind(x, matrix(, n-nrow(x), ncol(x))))) 
}

这个响应取自here(这里有一些用法示例)。

相关问题