【问题标题】:Why do rbind() and do.call(rbind, ) return different results?为什么 rbind() 和 do.call(rbind, ) 返回不同的结果?
【发布时间】:2016-01-28 23:32:51
【问题描述】:

我想将列表转换为数据框,代码如下:

ls<-list(a=c(1:4),b=c(3:6))
do.call("rbind",ls)

添加do.call得到的结果如下图。它会根据需要返回一个data.frame 对象。

 do.call("rbind",ls)
  [,1] [,2] [,3] [,4]
a    1    2    3    4
b    3    4    5    6

但是,如果我直接使用rbind,它会返回一个列表。

为什么rbind 在这两种情况下表现不同?

my.df<-rbind(ls)
str(ls)


 my.df
   a         b        
ls Integer,4 Integer,4

 str(ls)
List of 2
 $ a: int [1:4] 1 2 3 4
 $ b: int [1:4] 3 4 5 6

【问题讨论】:

  • do.call("rbind", ls) 返回一个矩阵,而不是一个数据框。与rbind(ls) 相同。
  • 因为do.call 将元素从列表中提取出来——这就是区别。好像你会做rbind(ls[[1]], ls[[2]])
  • 谢谢@RichardScriven,但rbind(ls) 的输出仍然是一个列表。其实我想要的是将列表转换为矩阵
  • 不,rbind(ls) 的输出是一个矩阵。它包含列表元素。见class(rbind(ls))
  • 因为在问这样的问题之前你应该阅读函数的帮助页面。 ?do.call

标签: r rbind do.call


【解决方案1】:

do.call(rbind, ls) 为您提供与Reduce(rbind, ls) 相同的输出。后者效率较低,但它可以显示您如何迭代 ls 中的对象,而不是直接操作 ls(这是 2 个列表的串联列表)。

它们都通过“取消列出”列表中的每个元素来操作,该列表具有类numeric。当您rbind 数字参数时,生成的类是一个矩阵,typeof 是整数。如果您只是rbind 列表,则列表的每个元素都被视为一个对象。所以返回的对象是一个matrix 对象,它有1 行2 列和list 类型的条目。它有 1 行应该表明它将对象ls 视为一件事,而不是两件事。输入 rbind(ls, ls, ls) 将给出 3 行和 2 列。

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2020-10-03
    • 1970-01-01
    • 2021-08-04
    相关资源
    最近更新 更多