使用大数据集在 R 中循环,更好的方法?

Loop in R with big data set, a better way?

亲爱的 Stack Overflow 用户,

目前我有一个 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 中,您不应使用 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函数也确实很快。我推荐你使用它。

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

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

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

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

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

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