рассчитывать отдельные уровни фрейма данных для групп на основе условия - PullRequest
3 голосов
/ 30 сентября 2019

У меня есть следующий DF

x = data.frame('grp' = c(1,1,1,2,2,2),'a' = c(1,2,1,1,2,1), 'b'= c(6,5,6,6,2,6), 'c' = c(0.1,0.2,0.4,-1, 0.9,0.7))

  grp a b    c
1   1 1 6  0.1
2   1 2 5  0.2
3   1 1 6  0.4
4   2 1 6 -1.0
5   2 2 2  0.9
6   2 1 6  0.7 

Я хочу посчитать различные уровни (a,b) для каждой группы, где c >= 0.1

Iпытался использовать dplyr для этого, используя group_by & summarise, но не получил желаемого результата

x %>% group_by(grp) %>% summarise(count = n_distinct(c(a,b)[c >= 0.1]))

В приведенном выше случае я ожидал бы следующий результат

    grp count
  <dbl> <int>
1     1     2
2     2     2

Однако, используя приведенный выше запрос, я получаю следующий результат

    grp count
  <dbl> <int>
1     1     4
2     2     3

Логически вышеприведенный вывод, кажется, решает для всех уникальных значений списка совпадений (a,b), но не то, что яТребуются любые указатели, очень ценю любую помощь

Ответы [ 3 ]

3 голосов
/ 30 сентября 2019

Вот еще один способ использования dplyr. Похоже, вы хотите filter на основе c, поэтому мы делаем это. Вместо использования c(a, b) в n_distinct мы можем записать его как n_distinct(a, b).

x %>%
    filter(c >= 0.1) %>%
    group_by(grp) %>%
    summarise(cnt_d = n_distinct(a, b))

#     grp cnt_d
#   <dbl> <int>
# 1     1     2
# 2     2     2
1 голос
/ 30 сентября 2019

Мы можем paste a и b столбцов и подсчитывать различные значения в каждой группе.

library(dplyr)

x %>% 
  mutate(col = paste(a, b, sep = "_")) %>%
  group_by(grp) %>%
  summarise(count = n_distinct(col[c >= 0.1]))

#    grp count
#  <dbl> <int>
#1     1     2
#2     2     2
0 голосов
/ 30 сентября 2019

Опция, использующая data.table

library(data.table)
setDT(x)[c >= 0.1, .(cnt_d = uniqueN(paste(a, b))), .(grp)]
#    grp cnt_d
#1:   1     2
#2:   2     2
...