2017-01-12 33 views
0

我有以下類型的數據幀:值進行比較的組合

date  ID1 ID2 sum 
2017-1-5 1  a  200 
2017-1-5 1  b  150 
2017-1-5 2  a  300 
2017-1-4 1  a  200 
2017-1-4 1  b  120 
2017-1-4 2  a  300 
2017-1-3 1  b  150 

我嘗試了不同的日期列組合之間進行比較,看是否sum值相等。因此,在上述示例中,我希望代碼能夠確定2017年1月5日和2017年1月4日之間[ID1=1, ID2=b]組合的總和不同(在我的實際數據中,我有超過2 ID個類別和超過2 Dates)。

我想我的輸出是一個數據框,它包含所有包含(至少一個)不等的結果的組合。在我的例子:

date  ID1 ID2 sum 
2017-1-5 1  b  150 
2017-1-4 1  b  120 
2017-1-3 1  b  150 

我嘗試使用循環像這樣解決:Is there a R function that applies a function to each pair of columns沒有巨大的成功。

您的幫助將不勝感激。

+0

你想讓你的輸出看起來像什麼?如果你的ID有多於兩個的日期,你只是想表明它們都是相同的或不相同的?或者,你想確定獨特的,還是什麼? – aichao

+0

我想** ** **總和不相等的組合;例如,一個看起來像這樣的數據框:(rows;'date')和(columns;'ID1','ID2','sum')...在我的例子中是這樣的:(1st row ='2017-1 (第二行=「2017-1-4」)和(第一列=「ID1」)(第二列=「ID2」)(第三列=總和)......並且2個單元格將顯示150和120.希望很明顯..我可能會改變我的問題.. – staove7

+0

如果你有三個日期和兩個他們有相同的總和,但第三個不?那麼你想在你的輸出中標記哪兩個? – aichao

回答

0

使用dplyr,我們可以group_by_(.dots=paste0("ID",1:2)),然後看看是否值unique

library(dplyr) 
res <- df %>% group_by_(.dots=paste0("ID",1:2)) %>% 
       mutate(flag=(length(unique(sum))==1)) %>% 
       ungroup() %>% filter(flag==FALSE) %>% select(-flag) 

group_by_允許用戶將多個ID列容易。只要將2更改爲ID列(即N),假設它們的連續編號從1N。創建列flag以指示所有值是否相同(即,unique值的數量是1)。然後我們filter的結果爲flag==FALSE。這給出了預期的結果:

res 
### A tibble: 3 x 4 
##  date ID1 ID2 sum 
##  <chr> <int> <chr> <int> 
##1 2017-1-5  1  b 150 
##2 2017-1-4  1  b 120 
##3 2017-1-3  1  b 150 
+0

令人驚歎。謝謝!還有一件事..是否有一種方法來「標記」只有總和大於總和的差異;例如,大於50(在我的例子中不會產生結果)? – staove7

+0

如果您有興趣標記每個組中大於'50'的'sum'值的範圍,那麼您可以使用'flag =(max(sum)-min(sum))<= 50'來代替' flag =(length(unique(sum))== 1)'mutate'內部。這將把'sum'值範圍小於或等於'50'的那些組設置爲'TRUE',這樣只有那些範圍大於'50'的組纔會被保留。 – aichao

+0

再次驚人。非常非常感謝你! – staove7