web-dev-qa-db-ja.com

異なる長さのベクトルで構成されるリストをRで使用可能なデータフレームに変換するにはどうすればよいですか?

(かなり長い)ベクトルのリストがあります。ベクトルは、文でstrsplit()関数を使用して得たロシア語の単語で構成されています。

head()が返すものは次のとおりです。

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

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

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

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

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

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

ベクトルの長さは異なることに注意してください。

私が欲しいのは、各文の最初の単語、2番目の単語、3番目の単語などを読むことができるようにすることです。

望ましい結果は次のようになります。

_    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の助けを得ました)が、それらはすべて、たとえばサイズの異なる2つのデータフレームを結合することに関するものでした。

ご協力いただきありがとうございます。

45
Ico

これを試して:

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

秘isは、それ、

c(1:2)[1:4]

ベクトル+ 2つのNAを返します

36
adibender

plyrを含む1つのライナー

plyr::ldply(Word.list, rbind)
77
Ramnath

別のオプションはlibrary(stringi)からのstri_list2matrixです

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

次のようなことができます:

## 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"
12
juba

data.table-packageのrbindlist()を使用することもできます。

lapply()を使用して、ベクターをdata.tableまたはdata.frameに変換し、転置します(これにより速度が大幅に低下するかどうかはわかりません)。次に、それらをrbindlist()でバインドします-欠落しているセルをNAで埋めます:

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

別のオプションとして、このような関数を定義することもできます(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))))) 
}

よろしく

0
jgarces