2015-06-08 45 views
1

我有一個數據框,稱爲具有4列(數字,A,B和Diff)的日期。編號是帶有參考編號的列。 A和B都是日期欄。 Diff是列A和B之間的天數。如果Column diff包含負數,我在列號中有重複項,並且想要刪除Number的所有值。請看下面的示例:R - 刪除列1中具有負值的列中的所有行,其他列中的值爲

Number   A    B    Diff 
    1   2015-06-08  2015-06-06   -2 
    1   2015-06-08  2015-06-06   -2 
    2   2015-06-01  2015-05-25   -7 
    2   2015-06-01  2015-06-06    5 
    3   2015-06-04  2015-06-07    3 
    3   2015-06-04  2015-06-06    2   

我這個結果應該是剛剛過去的2排,3號1號的兩行被刪除,因爲有一個負的DIFF和2號的兩行被刪除,因爲編號爲2的第一行具有負值。

我可以做到這一點,如果沒有重複的號碼列,但我正在努力與重複。

回答

4

嘗試

library(data.table) 
setDT(df1)[, if(!any(Diff < 0)) .SD, by = Number] 
# Number   A   B Diff 
#1:  3 2015-06-04 2015-06-07 3 
#2:  3 2015-06-04 2015-06-06 2 

或者用dplyr

library(dplyr) 
df1 %>% 
     group_by(Number) %>% 
     filter(all(Diff>=0)) 
+1

Uuuu我剛剛發佈了'setDT(df)[,if(all(Diff> = 0)).SD,by = Number]';) –

+1

@DavidArenburg看起來更整齊,不必否定 – akrun

+0

謝謝! !只是好奇--SD做什麼? –

2

基礎R可能性

df[with(df, ave(Diff, Number, FUN = function(x) any(x < 0))) == 0,] 
# Number   A   B Diff 
# 5  3 2015-06-04 2015-06-07 3 
# 6  3 2015-06-04 2015-06-06 2 

或更短的版本(每評論)

df[with(df, ave(Diff >= 0, Number, FUN = all)), ] 
+3

或避免匿名函數'df [(df,ave(Diff> = 0,Number,FUN = all)),]' – akrun

+2

@akrun nice one –

相關問題