使用for循环在数据表中创建多个列

时间:2016-09-14 02:03:46

标签: r for-loop data.table

我的数据表如下:

head(data)
    Date         AI   AGI      ADI   ASI   ARI   ERI   NVRI  SRI   FRI  IRI
1: 1991-09-06    NA 2094.19    NA    NA    NA    NA    NA    NA    NA    NA
2: 1991-09-13    NA 2204.94    NA    NA    NA    NA    NA    NA    NA    NA
3: 1991-09-20    NA 2339.10    NA    NA    NA    NA    NA    NA    NA    NA
4: 1991-09-27    NA 2387.81    NA    NA    NA    NA    NA    NA    NA    NA
5: 1991-10-04    NA 2459.94    NA    NA    NA    NA    NA    NA    NA    NA
6: 1991-10-11    NA 2571.07    NA    NA    NA    NA    NA    NA    NA    NA

不要担心NAs。我想要做的是为日期之外的每个列创建一个“百分比更改”列。

到目前为止我所做的是:

names_no_date <- unique(names(data))[!unique(names(data)) %in% "Date"]

for (i in names_no_date){
      data_ch <- data[, paste0(i, "ch") := i/shift(i, n = 1, type = "lag")-1]}

我收到错误:

Error in i/shift(i, n = 1, type = "lag") : 
  non-numeric argument to binary operator

我想知道如何解决这个错误?

1 个答案:

答案 0 :(得分:4)

i是一个字符串,因此您尝试在i/shift(i, n = 1, type = "lag")中划分字符串:

> "AI"/NA
Error in "AI"/NA : non-numeric argument to binary operator

相反,做

for (i in names_no_date){
      data[, paste0(i, "ch") := get(i)/shift(get(i), n = 1, type = "lag")-1]
}

另见Referring to data.table columns by names saved in variables

编辑:@Frank在评论中写道,产生OP输出的更简洁方法是

data[, paste0(names_no_date, "_pch") := .SD/shift(.SD) - 1, .SDcols=names_no_date]