Как сгруппировать по переменной A, чтобы получить минимальное значение из переменной B на основе условия переменной C - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть данные из 3 переменных A, B, C. Мне нужно сгруппировать по A и мне нужно минимальное значение B, когда C ненулевой.

> data
     A       B       C
1    a       3       0
2    a       6       1
3    a       9       2
4    a       12      2
5    b       3       0
6    b       6       0
7    b       9       0
8    b       12      4

Ожидаемый результат:

> output
     1       2
1    a       6       
2    b       12       

Я пытался сделать это, которое длилось более 2 часов:

rbind(by(data, data$A, function(x) min(x$B[x$C>0])))

1 Ответ

0 голосов
/ 28 декабря 2018

Мы группируем по 'A', получаем min из 'B', где 'C' не равно 0

library(dplyr)
df1 %>% 
   group_by(A) %>% 
   summarise(B = min(B[C > 0]))
# A tibble: 2 x 2
#  A         B
#   <chr> <int>
#1 a         6
#2 b        12

Или более быстрым вариантом будет сначала filter, затем сделаемgroup_by

df1 %>%
   filter(C > 0) %>%
   group_by(A) %>%
   summarise(B = min(B))

Или с data.table

library(data.table)
setDT(df1)[,.(B = min(B[C > 0])) , A]

data

df1 <- structure(list(A = c("a", "a", "a", "a", "b", "b", "b", "b"), 
B = c(3L, 6L, 9L, 12L, 3L, 6L, 9L, 12L), C = c(0L, 1L, 2L, 
2L, 0L, 0L, 0L, 4L)), class = "data.frame", row.names = c("1", 
 "2", "3", "4", "5", "6", "7", "8"))
...