Pertanyaan Filter grup berdasarkan kemunculan nilai


Cara memilih grup berdasarkan kondisi pada baris individual, katakan filter semua grup yang berisi nilai 4 (atau kondisi lainnya).

Mari kita ambil data yang sangat sederhana, dengan dua kelompok, dan saya ingin memilih grup B (seperti Nilai 4)

library(dplyr)
df <- data.frame(Group=LETTERS[c(1,1,1,2,2,2)], Value=c(1:5,4))

> df
  Group Value

1     A     1
2     A     2
3     B     3
4     B     4

Perbuatan group_by() lalu filter (seperti dalam posting ini) hanya akan memilih baris individu yang berisi nilai 4, bukan seluruh grup:

df %>%
  group_by(Group) %>%
  filter(Value==4)

Group Value
  <fctr> <int>
1      B     4

8
2017-11-27 01:53


asal


Jawaban:


Ini ternyata sangat mudah: Anda hanya perlu menggunakan any() berfungsi dalam filter panggilan. Memang, tampak bahwa:

  • filter(any(...))  mengevaluasi pada group_by() tingkat,

  • filter(...)  mengevaluasi pada rowwise() tingkat, bahkan ketika didahului oleh group_by().

Maka gunakan:

 df %>%
    group_by(Group) %>%
    filter(any(Value==4)) 

Group Value
 <fctr> <int>
1      B     3
2      B     4

Menariknya, hal yang sama muncul dengan bermutasi, bandingkan:

df %>%
group_by(Group) %>%
mutate(check1=any(Value==4), 
       check2=Value==4) 

   Group Value check1 check2
  <fctr> <int>  <lgl>  <lgl>
1      A     1  FALSE  FALSE
2      A     2  FALSE  FALSE
3      B     3   TRUE  FALSE
4      B     4   TRUE   TRUE

13
2017-11-27 01:53



SEBUAH data.table pilihannya adalah

library(data.table)
setDT(df)[, if(any(Value==4)) .SD, by = Group]
#   Group Value
#1:     B     4
#2:     B     5
#3:     B     4

0
2017-11-27 02:30