Apa yang akan menjadi pipa Dplyr yang benar untuk perhitungan dasar berikut?

dat      <- data.frame(a = 0:10, b = 0:10, c = 0:10)
dat$d    <- apply(dat, 1, sum)
ind      <- dat$d>quantile(dat$d[dat$d>0], 0.1)

Saya mencoba (tetapi gagal):

ind      <- tibble(dat) %>% rowwise() %>% 
               mutate(d = sum(c_across(a:c)), ind = d>quantile(select_var(d>0), 0.1)) %>%
               pull(ind)
0
SimeonL 12 Mei 2021, 10:33

2 jawaban

Jawaban Terbaik
tibble(dat) %>% 
  rowwise() %>% 
  mutate(
    d = sum(c(a, b, c)),
    ind = d > quantile(dat %>% filter(d >0) %>% pull(d), 0.1)
  ) %>%
  pull(ind)

Memberikan nilai yang sama dengan ind Anda. Sedikit kesulitan adalah karena fakta bahwa Anda menghitung kuantil berdasarkan subset dari kerangka data Anda daripada keseluruhannya.

1
Limey 12 Mei 2021, 07:54

Ini dapat Anda lakukan menggunakan .$ sehingga quantile dikembalikan untuk seluruh data

dat %>% rowwise() %>% 
  mutate(d = sum(c_across(a:c))) %>% 
  mutate(ind = d > quantile(.$d[.$d >0], 0.1))

    a  b  c  d   ind
1   0  0  0  0 FALSE
2   1  1  1  3 FALSE
3   2  2  2  6  TRUE
4   3  3  3  9  TRUE
5   4  4  4 12  TRUE
6   5  5  5 15  TRUE
7   6  6  6 18  TRUE
8   7  7  7 21  TRUE
9   8  8  8 24  TRUE
10  9  9  9 27  TRUE
11 10 10 10 30  TRUE

Periksa apakah tanpa menambahkan .$ sebelum d akan mendapatkan hasil yang tidak diinginkan

dat %>% rowwise() %>% 
  mutate(d = sum(c_across(a:c))) %>% 
  mutate(ind = d > quantile(d[d >0], 0.1))

# A tibble: 11 x 5
# Rowwise: 
       a     b     c     d ind  
   <int> <int> <int> <int> <lgl>
 1     0     0     0     0 NA   
 2     1     1     1     3 FALSE
 3     2     2     2     6 FALSE
 4     3     3     3     9 FALSE
 5     4     4     4    12 FALSE
 6     5     5     5    15 FALSE
 7     6     6     6    18 FALSE
 8     7     7     7    21 FALSE
 9     8     8     8    24 FALSE
10     9     9     9    27 FALSE
11    10    10    10    30 FALSE
0
AnilGoyal 12 Mei 2021, 09:08