【发布时间】:2016-09-14 02:03:45
【问题描述】:
我的数据表如下:
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
不用担心 NA。我想要做的是为除日期之外的每一列创建一个“百分比变化”列。
到目前为止我所做的是:
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
我想知道如何解决这个错误?
【问题讨论】:
-
请更清楚一点,你所说的“百分比变化”是什么意思——你的意思是增长函数?
-
您只需将“数字”传递给“二元运算符”即可“绕过它”。您的
i / shift(i, ...)期望数值作为分子和分母。也许您需要担心NAs?并确保你不是lagging 到一个不存在的行。 -
如果您使用的是 data.table,请使用 data.table 语法。要创建一个新的 data.table,
dt[, lapply(.SD, function(i){i / shift(i)}), .SDcols = -1]。添加到现有的;dt[, paste0(names(dt)[-1], 'ch') := lapply(.SD, function(i){i / shift(i)}), .SDcols = -1]。如果必须使用for循环,请预先分配适当大小的对象。
标签: r for-loop data.table