2017-06-25 4 views
1

私はデータフレームdataを次のように持っています。 によれば、列c1c2の値の差を列v1,v3およびv4を効率的に使用してdata.tableを使用する方法の違いを取得するにはどうすればよいですか?他の列に従ってdata.tableの行を取得する

data <- data.frame(index = c("A", "B", "C", "D", "C", "A", "D", "B"), 
        class = c(rep("c1", 4), rep("c2", 4)), 
        v1 = c(21,85,74,96,55,77,21,34), 
        v3 = c(77,41,91,85,22,74,36,41), 
        v4 = c(41,58,24,36,84,24,74,11)) 

setDT(data) 
data[, index := as.factor(index)] 
data[, class := as.factor(class)] 

    index class v1 v3 v4 
1:  A c1 21 77 41 
2:  B c1 85 41 58 
3:  C c1 74 91 24 
4:  D c1 96 85 36 
5:  C c2 55 22 84 
6:  A c2 77 74 24 
7:  D c2 21 36 74 
8:  B c2 34 41 11 

所望の出力が

out <- data.frame(index = data[1:4]$index, 
      v1 = data[1:4]$v1 - data[5:8]$v1, 
      v3 = data[1:4]$v3 - data[5:8]$v3, 
      v4= data[1:4]$v4 - data[5:8]$v4) 
out 
    index v1 v3 v4 
1  A -56 3 17 
2  B 51 0 47 
3  C 19 69 -60 
4  D 75 49 -38 

答えて

4

あなたはあなたの数値列にインデックスごとdiff()関数を適用することができます:

data[,lapply(.SD,diff),by=index,.SDcols = v1:v4] 
# index v1 v3 v4 
#1:  A 56 -3 -17 
#2:  B -51 0 -47 
#3:  C -19 -69 60 
#4:  D -75 -49 38 

は(あなたの期待出力のように)サインを反転するには、 .SD

の代わりに -.SDをそのまま使用できます
関連する問題