使用大数据集在 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
函数。
在您的情况下,指定参数 from
、by
和 length.out
是实现您的目标的最便捷方式:
PhoneSensorData$UnixTimestamp <-
seq(from = 1496944482155, by = 5, length.out = nrow(PhoneSensorData))
亲爱的 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
函数。
在您的情况下,指定参数 from
、by
和 length.out
是实现您的目标的最便捷方式:
PhoneSensorData$UnixTimestamp <-
seq(from = 1496944482155, by = 5, length.out = nrow(PhoneSensorData))