Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将由不同长度的向量组成的列表转换为R中的可用数据帧?_R_Vector_Dataframe - Fatal编程技术网

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

如何将由不同长度的向量组成的列表转换为R中的可用数据帧?,r,vector,dataframe,R,Vector,Dataframe,我有一个(相当长的)向量列表。向量由俄语单词组成,我是通过对句子使用strsplit()函数得到的 以下是head()返回的内容: [[1]] [1] "модно" "создавать" "резюме" "в" "виде" [[2]] [1] "ты" "начианешь" "работать" "с" "этими" [[3]] [1] "модно" "называть"

我有一个(相当长的)向量列表。向量由俄语单词组成,我是通过对句子使用
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
帮助的原因),但这些问题都是关于组合例如两个不同大小的数据帧


谢谢你的帮助

您可以这样做:

## 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)
试试这个:

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

返回向量+两个NAs

一行带
plyr

plyr::ldply(word.list, rbind)

另一个选项是
stri_list2matrix
from
library(stringi)

注:数据来自@juba的帖子

或者在评论中提到@Valentin

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

sapply(l,“length您也可以使用包中的
rbindlist()

lappy()
的帮助下,将向量转换为
data.table
s或
data.frame
s,并将其转置(不确定这是否会大大降低速度)。然后用
rbindlist()
将其绑定,用NA填充缺失的单元格

require(data.table)
l=列表(c(“a”、“b”、“c”)、c(“a2”、“b2”)、c(“a3”、“b3”、“c3”、“d3”))
dt=RbinList(
lappy(l,函数(x)数据表(t(x)),
填充=真
)

另一个选项可以是定义这样的函数(它将模拟
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))))) 
}

cbind.fill可能
sappy(1:length(your_list),function(j)yourlist[[j][1])
?这可以进一步压缩为一行:
sappy(word.list,[',seq(max(sappy(word.list,length))
(如图所示)对于那些使用@Arun的单行解决方案的人,请注意必须有转置
t()
创建适当的列,如原始问题中所述。啊哈——我们忘记的是(朱巴和我)您不需要“填写”“原始列表元素具有
NA
值。我在注释中输入的
sapply
片段对于短于请求的索引值的列表元素返回
NA
sapply
不崩溃不是很好吗?:-)我认为您给出的优雅的base R解决方案也值得一提:
sapply(l,“lengthif i have list and inside list how to do this?”@PesKchan为此,您可能需要一个嵌套循环,即
lappy(l,function(subl)lappy(subl)长度。我想请你看看这个。我的想法是将列表更改为dataframe,然后更改为data table。有没有直接到data table的方法?Sir@akrun我肯定不是其中之一,我的许多博士生物学数据分析代码都是从你回答的各种问题的答案中获取的。不确定,这是如何工作的,你不提供举个例子。看起来像是这里的复制品:另外:rowr不再在CRAN上了。
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"
sapply(l, "length<-", max(lengths(l)))
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))))) 
}