循环更快

时间:2019-08-20 12:00:32

标签: r for-loop data.table

我有一个约2000万行文件,并且我试图在其上运行for循环。我等了整个周末,但还没有完成1%。

我正在尝试对每一行的一列进行计算。如果值为<0.5,它将采用该值并将其添加到新列中;否则,将采用该值并将其从1中减去,然后将该值添加到新列中。

for (i in 1: length(halflife$year)){
  if(halflife$year[i] < 0.5){
    halflife$month[i] = halflife$year[i]
  } else{
    halflife$month[i] = 1 - halflife$year[i]
  }
}

应在month上添加一个名称为halflife的新列,且所有值均小于0.5

4 个答案:

答案 0 :(得分:6)

使用data.table包,应该会更快

library(data.table)

halflife = data.table(halflife)
halflife[year < 0.5, month := year]
halflife[year >= 0.5, month := 1 - year]

此外,如果您要从csv文件读取数据,请使用fread()中的data.table而不是read.csv()。更快

答案 1 :(得分:2)

halflife$month = halflife$year
ind = (halflife$year >= 0.5)
halflife$month[ind] = 1 - halflife$year[ind]

答案 2 :(得分:0)

您可以尝试这个。

library(data.table)       
halflife %>% data.table(.) %>% [,':='(ans = ifelse(year < 0.5, year, 1-year))]

如果您想学习data.table软件包,可以先从DataCamp课程中阅读正式备忘单。(https://s3.amazonaws.com/assets.datacamp.com/img/blog/data+table+cheat+sheet.pdf

答案 3 :(得分:0)

data.table的相对较新的fifelse函数可以在数百万行上以惊人的速度运行。试试:

library(data.table)
setDT(halflife)
halflife[, month := fifelse(year < 0.5, year, 1-year)]