什么等效于do.call(rbind,list)

  • 本文关键字:rbind list call do r
  • 更新时间 :
  • 英文 :


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

我想尝试其他能产生与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)

我试过这个:

df=matrix(as.numeric(unlist(x)), nrow= 3)

但是

identical(dat,df)
> identical(dat,df)
[1] FALSE

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

注意:查看

> 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

我对的结果并不感到惊讶

identical(dat,df)
[1] FALSE

然而,看看

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

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

另一种选择是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

不过,您可以将其封装到t()中以转置结果。

不过,更一般地说,如果你想检查列表中的所有元素是否都有相同的长度,你可能会更成功地找到之类的错误

sapply(x, length)
[1] 4 4 4

或者根据实际数据的外观,使用ncol左右的变体来代替length。如果列表元素具有列名,那么names也可能是一个有效的替代方案。

您需要添加byrow = TRUE:

df=matrix(as.numeric(unlist(x)), nrow= 3, byrow = TRUE)

最新更新