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

时间:2017-06-09 09:52:04

标签: r loops csv rstudio

亲爱的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,所以没关系。

提前致谢!

3 个答案:

答案 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函数。

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

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