什么相当于do.call(rbind,list)?

bic*_*ton 5 r

在我的真实数据中,我得到了 warning number of columns of result is not a multiple of vector length (arg 1),虽然我的列表中有一个唯一数量的cols,当我使用时do.call("rbind"

我想尝试一些与do.call(rbind,list)产生相同输出的其他东西,以检查问题在我的列表中是否存在.

       n = c(2, 3, 5,4) 
       n1 = c(2, 7, 4,6) 
       n2 = c(NA, NA, NA,NA) 
       x = list(n, n1, n2)
      dat <- do.call("rbind", x)
Run Code Online (Sandbox Code Playgroud)

我试过这个:

      df=matrix(as.numeric(unlist(x)), nrow= 3)
Run Code Online (Sandbox Code Playgroud)

      identical(dat,df)
     > identical(dat,df)
      [1] FALSE
Run Code Online (Sandbox Code Playgroud)

PS:我不想改变 class or str of my list

cof*_*nky 7

只是一个注意:看着

> dat
     [,1] [,2] [,3] [,4]
[1,]    2    3    5    4
[2,]    2    7    4    6
[3,]   NA   NA   NA   NA
> df
     [,1] [,2] [,3] [,4]
[1,]    2    4    4   NA
[2,]    3    2    6   NA
[3,]    5    7   NA   NA
Run Code Online (Sandbox Code Playgroud)

我对结果并不感到惊讶

identical(dat,df)
[1] FALSE
Run Code Online (Sandbox Code Playgroud)

但是,看看

df=matrix(as.numeric(unlist(x)), nrow= 3, byrow = T)
identical(dat,df)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

替代品 do.call(rbind, list)

如果您正在寻找替代方案do.call,请查看dplyr::bind_rows(以数据帧为基础并且非常有效).第二种选择可以是Reduce,如:

Reduce(rbind, x)
     [,1] [,2] [,3] [,4]
init    2    3    5    4
        2    7    4    6
       NA   NA   NA   NA
Run Code Online (Sandbox Code Playgroud)

另一种选择是以data.table::rbindlist列表(!)为基础.请注意,输出将被转置,这意味着每行将显示为一列.看到

library(data.table)
rbindlist(list(x))
   V1 V2 V3
1:  2  2 NA
2:  3  7 NA
3:  5  4 NA
4:  4  6 NA
Run Code Online (Sandbox Code Playgroud)

但是,您可以将其包装t()以转置结果.

但更一般地说,如果要检查列表中的所有元素是否具有相同的长度,您可能会更成功地找到类似的错误

sapply(x, length)
[1] 4 4 4
Run Code Online (Sandbox Code Playgroud)

或者取决于你的实际数据是什么样的,变化如ncol或等,而不是length.如果列表元素具有列名,那么names也可能是有效的替代.


小智 5

您需要添加byrow = TRUE

df=matrix(as.numeric(unlist(x)), nrow= 3, byrow = TRUE)
Run Code Online (Sandbox Code Playgroud)