【问题标题】:Loop in R with big data set, a better way?使用大数据集在 R 中循环,更好的方法?
【发布时间】:2017-11-11 06:54:36
【问题描述】:

亲爱的堆栈溢出者,

目前我有一个包含 33 列、1447499 行的数据集。

现在我想用新数据添加 1 个新列(Unix 时间戳基于第 33 列中的日期)

我手动创建了第一个时间戳,然后每次都必须在时间戳上添加 5(毫秒),下面的代码有用吗?

到目前为止我做了什么:

# Data loading is fine
PhoneSensorData$UnixTimestamp <- 0
lengte = nrow(PhoneSensorData)
PhoneSensorData$UnixTimestamp[1] = 1496944482155

for (i in 1:lengte) {
  PhoneSensorData$UnixTimestamp[i] = 1496944482155 + (5*i)
}

但这运行了很长时间(或者现在已经将近一个小时没有完成) 我做错了什么,还是有更好的方法?

然后,我必须再次将其导出回 csv。 使用 fread 加载数据大约需要 10-15 秒,这很好。

提前致谢!

【问题讨论】:

    标签: r loops csv rstudio


    【解决方案1】:

    在 R 中,您不应该使用 for 循环来创建/编辑新列。 它们是基于向量的运算,而 R 非常擅长基于向量的运算。

    使用 data.table,您可以使用以下代码:

    library(data.table)
    PhoneSensorData <- data.table(PhoneSensorData)
    PhoneSensorData[, RowNumber := 1:.N]
    PhoneSensorData[, UnixTimeStamp := 1496944482155  + RowNumber * 5 ]
    fwrite(PhoneSensorData, file="PhoneSensorData.csv")
    

    PS:data.table 的 fwrite 函数也非常快。我建议你使用它。

    【讨论】:

    • 您可以使用.I 而不是生成RowNumber,这样可以节省内存并可能节省一点时间。
    【解决方案2】:

    由于矢量化,这应该会更快:

    PhoneSensorData$UnixTimestamp = 1496944482155 + (5*(1:lengte))
    

    通过保存,您无法加快速度,因为您添加了一列,因此必须重写文件的每一行。这里的瓶颈是文件系统。

    【讨论】:

    • 这对我有用!非常感谢,为我节省了很多时间:)
    【解决方案3】:

    要创建常规数据序列(无论是字符串、数字还是日期和时间),您可以使用标准 R seq 函数。

    在您的情况下,指定参数 frombylength.out 是实现目标的最便捷方式:

    PhoneSensorData$UnixTimestamp <- 
                seq(from = 1496944482155, by = 5, length.out = nrow(PhoneSensorData))
    

    【讨论】:

    • 尝试提供更详细的格式正确的答案。
    猜你喜欢
    • 2022-12-07
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 2017-08-31
    • 2016-06-07
    相关资源
    最近更新 更多