2016-01-29 97 views
2

假設數據:創建基於R中的另一個數據幀的索引的新數據幀

hypo <- data.frame('X1' = c('a','b','a','b','a','b','a','b'), 
     'X2' = c('x','x','y','y','x','x','y','y'), 
     'X3' = c('m','m','m','m','n','n','n','n'), 
     'X4' = c(1,6,4,9,10,7,8,3)) 

輸出:

X1 X2 X3 X4 
1 a x m 1 
2 b x m 6 
3 a y m 4 
4 b y m 9 
5 a x n 10 
6 b x n 7 
7 a y n 8 
8 b y n 3 

你想找到當X1和X2值X4值之間的差異相同和X3是不同的。例如,我們可以利用子集()爲一個單一的值執行此操作:

value <- (subset(hypo, X1 == 'a' & X2 == 'x' & X3 == 'm')$X4 
- subset(hypo, X1 == 'a' & X2 == 'x' & X3 == 'n')$X4) 
# -9 

我們怎樣才能做到這一點,使得對於X4值之間的差值被計算爲其中X 1和X 2相同且X 3不同的所有實例?

理想輸出:

X1 X2 m-n 
1 a x -9 
2 b x -1 
3 a y -4 
4 b y 6 

任何幫助將不勝感激。

回答

2

這一個是明確的,它應該計算m-n而非n-m

library(dplyr) 
hypo %>% group_by(X1, X2) %>% 
    summarize(`m-n` = X4[X3=="m"] - X4[X3=="n"]) 
2

這對dplyr非常簡單。只需要group_by這兩個變量你想要的一樣,然後summarisediff來減去兩個。它確實N-M在默認情況下,這樣使它的負獲得M-N:

> library(dplyr) 
> hypo %>% group_by(X1, X2) %>% summarise(-diff(X4)) 
Source: local data frame [4 x 3] 
Groups: X1 [?] 

     X1  X2 -diff(X4) 
    (fctr) (fctr)  (dbl) 
1  a  x  -9 
2  a  y  -4 
3  b  x  -1 
4  b  y   6 
相關問題