【发布时间】:2022-07-22 22:09:00
【问题描述】:
dt <- data.frame(name = "John",children = I(list(c(1,2,3))))
name children
1 John 1, 2, 3
尝试后
dt[nrow(dt) + 1,] = c("Amos", I(list(c(3,4,5))))
我得到了错误
警告信息:
在
[<-.data.frame(*tmp*, nrow(dt) + 1, , value = list("Amos", :
替换元素2有3行替换1行
【问题讨论】:
-
也使用
list()。例如:rbind(dt, list("Amos", I(list(c(3,4,5))))) -
仅供参考,迭代地将行添加到框架有效,但它的扩展性很差:如果你重复这样做,那么它会减慢到爬行。这样做的原因是当您
rbind两帧(或一帧和一个列表)时,它会制作第一帧的完整副本。这意味着如果您在一个框架中有(比如说)100K 行,并且想要向其中添加 1 行,它必须将所有 100K 行复制到一个 100K+1 行框架中;随着对象大小的增加,这会减慢,并且您的 100K 行数据在内存中存在两次(一段时间直到垃圾收集)。 -
参见The R Inferno中的“成长中的对象”
-
@r2evans 这正是我想做的,最好的选择是什么
-
最好生成这些新行的列表,然后一次
rbind它们;例如,out <- list(); for (...) { out <- c(out, list(newrow)); }; alldat <- do.call(rbind, out);.
标签: r