我有以下数据表:
library(data.table)
> dt1
id i i-2015 a a-2015 w w-2015 f f-2015
1: A 2 1 1 1 2 2 2 1
2: B 4 2 2 1 3 1 3 3
3: C 6 6 3 1 4 2 5 1
dt1 <- structure(list(id = c("A", "B", "C"), i = c(2, 4, 6), `i-2015` = c(1,
2, 6), a = c(1, 2, 3), `a-2015` = c(1, 1, 1), w = c(2, 3, 4),
`w-2015` = c(2, 1, 2), f = c(2, 3, 5), `f-2015` = c(1, 3,
1)), .Names = c("id", "i", "i-2015", "a", "a-2015", "w",
"w-2015", "f", "f-2015"), class = c("data.table", "data.frame"
))
我想要实现的是在每两列添加一个新列,计算两列之间的差异,如下所示:
> result
id i i-2015 i difference a a-2015 a difference w w-2015 w difference f f-2015 f difference
1: A 2 1 1 1 1 0 2 2 0 2 1 1
2: B 4 2 2 2 1 1 3 1 2 3 3 0
3: C 6 6 0 3 1 2 4 2 2 5 1 4
我尝试做的是以下内容,首先找到我需要添加差异的列,然后使用add_column指定:
library(tibble)
diff_columns <- unique(str_replace(names(dt1), "-2015", ""))[-1]
for (i in 1:length(diff_columns)) {
assign(paste(diff_columns[i], "difference"), dt1[, get(diff_columns[i]) - get(paste0(diff_columns[i], "-2015"))])
dt1 <- add_column(dt1, get(paste(diff_columns[i], "difference")), .after = paste0(diff_columns[i], "-2015"))
}
但这在很多方面都失败了......
首先dt1[, get(diff_columns[i]) - get(paste0(diff_columns[i], "-2015"))]
没有得到我想要的东西,我不知道为什么。
dt1[, get(diff_columns[i])]
部分按预期工作,但不是dt1[get(paste0(diff_columns[i], "-2015"))]
部分。
第二个add_column部分不评估粘贴(diff_columns [i],“difference”)并尝试将其用作列名,但由于不能存在重复的列名,因此无效。
答案 0 :(得分:0)
我们可以使用
m1 <- do.call(cbind, Map(cbind, dt1[, 2:(ncol(dt1)-1)],
dt1[, 3:ncol(dt1)], dt1[, 2:(ncol(dt1)-1)] - dt1[, 3:ncol(dt1)]))