2017-06-07 75 views
3

在下面的data.frame中,我有3個變量。 id(A1至A10);變量A到E和值。我想根據這些條件刪除特定的行根據一行刪除多行

對於每個變量var(A,B,C,D或E);

如果id == A5

如果value < 5

然後

刪除該特定變量的所有行(10行)。

我將不勝感激任何建議如何做到這一點。

> dput(df) 
structure(list(id = structure(c(1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 2L, 1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 2L, 1L, 3L, 4L, 
5L, 6L, 7L, 8L, 9L, 10L, 2L, 1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 
10L, 2L, 1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 2L), .Label = c("A1", 
"A10", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9"), class = "factor"), 
    var = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 
    3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
    5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L), .Label = c("A", 
    "B", "C", "D", "E"), class = "factor"), value = c(2, 4, 7, 
    8, 8, 6, 3, 8, 4, 2, 3, 5, 4, 3, 2, 7, 4, 2, 1, 22, 54, 21, 
    36, 52, 14, 75, 12, 15, 24, 3, 2, 4, 5, 7, 9, 21, 22, 12, 
    12, 12, 0.3, 0.4, 0.9, 2, 3, 2, 0.5, 0.2, 0.4, 0.7)), .Names = c("id", 
"var", "value"), class = "data.frame", row.names = c(NA, -50L 
)) 
+0

https://stackoverflow.com/questions/24512873/using-dplyr-with-filter-group-by-tail – akrun

回答

5

我們可以使用group_byfilterdplyr這樣做,我們去掉其中有any發生少id爲 「A5」 和value組(var)比5.

library(dplyr) 
df %>% 
    group_by(var) %>% 
    filter(!any(id == 'A5' & value < 5)) 
+0

男人,OP是如此令人困惑.... –

+1

@Noobie我有點得到它,但會更好,如果預期輸出共享。 –

+0

@Noobie 我不是故意混淆你。 Ronak指出,我應該分享預期的產出。 – aelwan

0

好,你總是可以做

df %>% filter((id != A5) | (value >= 5)) 
+1

恕我直言的可能的複製,但這並沒有爲OP的問題提供答案。所以這不應該在這裏。 :) –

1

我們可以用base R

df[with(df, ave(!(id == 'A5' & value < 5), var, FUN = any)),] 

或者使用data.table

library(data.table) 
setDT(df)[df[, .I[any(!(id == 'A5' & value < 5))], var]$V1] 
+1

感謝您的時間和幫助 – aelwan