在我的真实数据中,我收到警告结果的列数不是向量长度(arg 1)的倍数
,尽管我的列表具有唯一的列数,当我使用 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)
我尝试过这个:
df=matrix(as.numeric(unlist(x)), nrow= 3)
但是
identical(dat,df)
> identical(dat,df)
[1] FALSE
PS:我不想更改列表的类或str
最佳答案
请注意:查看
> 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
也可能是有效的替代方案。
关于r - 什么相当于 do.call(rbind, list)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37459677/