有没有比“ for”循环更有效的方法来填充额外的列?

时间:2019-04-04 08:19:35

标签: r data.table

我有一个约有10万行的data.table。我将简化为仅3列,因为这就是这里的全部内容。

dt <- data.table(indicator = c("x", "y"), 
                 date1 = c("20190111", "20190212", "20190512", "20190723"), 
                 date2 = c("20190105", "20190215", "20190616", "20190623"))

我要做的是将date1或date2分配给新列'final_date',具体取决于指标列。如果指标为“ x”,则将final_date分配为date1。如果指标“ y”将final_date分配为date2。

我能够使用“ for”循环和if / else语句来完成此操作,但要花10分钟才能完成10万行。

for (row in 1:nrow(dt)) {
  if(dt$indicator[row] == "x") {
    dt$final_date[row] <- dt$date1[row]
  } else {
    dt$final_date[row] <- dt$date2[row]
  }
  }

有没有更有效的方法来使用data.table功能或其他功能?

3 个答案:

答案 0 :(得分:3)

使用data.table,我会做这样的事情:

dt[, final_date := ifelse(indicator == "x", date1, date2)]

真正快捷而简单!我怀疑对于大量数据,它会比dplyr以及您拥有的解决方案更快,因为data.table会发生适当的突变,而不是创建数据的副本。

答案 1 :(得分:0)

通过dplyr管道

> dt%>%mutate(final_data=if_else(indicator=="x",date1,date2))
  indicator    date1    date2 final_data
1         x 20190111 20190105   20190111
2         y 20190212 20190215   20190215
3         x 20190512 20190616   20190512
4         y 20190723 20190623   20190623

答案 2 :(得分:0)

尝试一下:

# necessary package
library(dplyr)
library(data.table)
# reproduce your data
dt <- data.table(
  indicator = c("x", "y"),
  date1 = c("20190111", "20190212", "20190512", "20190723"),
  date2 = c("20190105", "20190215", "20190616", "20190623")
)
# create your variable final_date
dt[, final_date := case_when(indicator == "x" ~ date1,
                             TRUE ~ date2)]

希望有帮助