亲爱的Stack Overflow',
目前,我的数据集为33列,行数为1447499。
现在我想添加一个包含新数据的新列(基于第33列日期的Unix时间戳)
我手动创建了第一个时间戳,然后每次都要为时间戳添加5(ms),下面的代码是否有用?
到目前为止我做了什么:
# 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。 加载数据需要大约10-15秒的fread,所以没关系。
提前致谢!
答案 0 :(得分: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函数也非常快。我建议你使用它。
答案 1 :(得分:1)
由于矢量化,这应该更快:
PhoneSensorData$UnixTimestamp = 1496944482155 + (5*(1:lengte))
通过保存,您无法加快速度,因为您添加了一列,因此必须重写文件的每一行。这里的瓶颈是文件系统。
答案 2 :(得分:0)
要创建常规数据序列(无论是字符串,数字,还是日期和时间),您都可以使用标准的R seq
函数。
在您的情况下,指定参数from
,by
和length.out
是实现目标的最便捷方式:
PhoneSensorData$UnixTimestamp <-
seq(from = 1496944482155, by = 5, length.out = nrow(PhoneSensorData))