gpt4 book ai didi

r - 如何将行追加到 R 数据框

转载 作者:行者123 更新时间:2023-12-03 04:40:23 24 4
gpt4 key购买 nike

我查看了 StackOverflow,但找不到针对我的问题的解决方案,该解决方案涉及将行 append 到 R 数据框。

我正在初始化一个空的 2 列数据框,如下所示。

df = data.frame(x = numeric(), y = character())

然后,我的目标是迭代值列表,并在每次迭代中将一个值 append 到列表末尾。我从以下代码开始。

for (i in 1:10) {
df$x = rbind(df$x, i)
df$y = rbind(df$y, toString(i))
}

我还尝试了 cappendmerge 函数,但没有成功。如果您有任何建议,请告诉我。

评论更新:我不知道 R 是如何使用的,但我想忽略每次迭代更新索引所需的额外代码行,并且我无法轻松地预先分配数据帧的大小,因为我不不知道最终需要多少行。请记住,上面只是一个可复制的玩具示例。不管怎样,谢谢你的建议!

最佳答案

更新

不知道您要做什么,我将分享另一个建议:为每一列预分配您想要的类型的向量,将值插入到这些向量中,然后最后创建您的 data.frame .

继续朱利安的f3 (预分配的 data.frame )是迄今为止最快的选项,定义为:

# pre-allocate space
f3 <- function(n){
df <- data.frame(x = numeric(n), y = character(n), stringsAsFactors = FALSE)
for(i in 1:n){
df$x[i] <- i
df$y[i] <- toString(i)
}
df
}

这是一种类似的方法,但其中 data.frame作为最后一步创建。

# Use preallocated vectors
f4 <- function(n) {
x <- numeric(n)
y <- character(n)
for (i in 1:n) {
x[i] <- i
y[i] <- i
}
data.frame(x, y, stringsAsFactors=FALSE)
}

microbenchmark “microbenchmark”包将为我们提供比 system.time 更全面的见解:

library(microbenchmark)
microbenchmark(f1(1000), f3(1000), f4(1000), times = 5)
# Unit: milliseconds
# expr min lq median uq max neval
# f1(1000) 1024.539618 1029.693877 1045.972666 1055.25931 1112.769176 5
# f3(1000) 149.417636 150.529011 150.827393 151.02230 160.637845 5
# f4(1000) 7.872647 7.892395 7.901151 7.95077 8.049581 5

f1() (下面的方法)效率极其低下,因为它调用 data.frame 的频率很高。并且因为在 R 中以这种方式生长对象通常很慢。f3()由于预分配而得到很大改善,但是 data.frame结构本身可能是这里瓶颈的一部分。 f4()尝试绕过该瓶颈而不影响您想要采取的方法。

<小时/>

原始答案

这确实不是一个好主意,但如果你想这样做,我想你可以尝试:

for (i in 1:10) {
df <- rbind(df, data.frame(x = i, y = toString(i)))
}

请注意,在您的代码中,还存在另一个问题:

  • 您应该使用stringsAsFactors如果您希望字符不转换为因子。使用:df = data.frame(x = numeric(), y = character(), stringsAsFactors = FALSE)

关于r - 如何将行追加到 R 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20689650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com