计算差异并为数据表中的每两列添加新列

时间:2017-05-18 15:12:42

标签: r data.table

我有以下数据表:

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”)并尝试将其用作列名,但由于不能存在重复的列名,因此无效。

1 个答案:

答案 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)]))