【问题标题】:Is there a way to add add entries to the following dataframe in R有没有办法在 R 中向以下数据框添加添加条目
【发布时间】: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))))

我得到了错误

警告信息:

[&lt;-.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 &lt;- list(); for (...) { out &lt;- c(out, list(newrow)); }; alldat &lt;- do.call(rbind, out);.

标签: r


【解决方案1】:

我认为你的问题是 c() 单行数据框将是一个列表,而不是原子向量。 试试:

dt[nrow(dt) + 1,] = list("Amos", I(list(c(3,4,5))))

或:

dt <- rbind(dt, list("Amos", I(list(c(3,4,5)))))

请注意,根据下面的 r2evans 注释和 R inferno 的链接,这是一种处理大数据帧的方式变得非常缓慢且需要大量内存,因为它们会为每个新行复制。有更好的方法来解决这个问题,我的回答只是为了解决您的原始代码无法正常工作的原因。

【讨论】:

  • 请谨慎提出此建议:这是一种不好的做法,除了最简单的执行之外,强烈建议不要这样做。请参阅我的 cmets,了解它的扩展性如何,并且在 The R Inferno 中阅读了“Growing Objects”,内容丰富(且略带娱乐性)
  • 哦,我同意 - 我正在回答“为什么它不起作用?”的问题。而不是“我应该怎么做?”生成行列表并 rbind() 一次会更好,或者将数据框定义为完整大小然后填充它。我不会在这里添加更多细节,因为你的地狱链接涵盖了几个不错的选择。
猜你喜欢
  • 2023-03-24
  • 2015-03-11
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
相关资源
最近更新 更多