(かなり長い)ベクトルのリストがあります。ベクトルは、文で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つのデータフレームを結合することに関するものでした。
ご協力いただきありがとうございます。
これを試して:
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を返します
plyr
を含む1つのライナー
plyr::ldply(Word.list, rbind)
別のオプションは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)))
次のようなことができます:
## 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"
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)
別のオプションとして、このような関数を定義することもできます(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)))))
}
よろしく