2017-05-18 75 views
-1

,我有以下數據表:計算差異,在數據表中增加新列,每兩列

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],「差異」),並嘗試將其用作列名稱,因爲不能重複列名稱,所以不起作用。

+4

如果清理您的數據,這是相當容易。像'melt(dt1,id =「id」,meas = patterns(「^ \\ w $」,「^ \\ w - \\ d {4} $」),value.name = c(「letter」 ,「yr」),variable.factor = FALSE)[。(v = as.character(1:4),r = c(「i」,「a」,「w」,「f」)) 。(變量= v),變量:= ir] []',之後你想在發佈時只回到不可行的寬格式。 – Frank

+1

是的,你可能是對的。感謝您的意見。 – User2321

回答

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)])) 
+0

謝謝。結果不是我想要的,第4列的值爲1,2,6,而理論上(如果我理解正確),它應該具有dt1中列a的值,因此爲1,2,3。而且結果有21列,有些不對... – User2321