2017-01-24 1 views
0

У меня есть dataframe (DF) с тремя столбцами, как так:Условный Количество в кадре данных

Состав:

id id1 age 
A1 a1 32 
A1 a2 45 
A1 a3 45 
A1 a4 12 
A2 b1 15 
A2 b5 34 
A2 b64 17 

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

id count count1 
A1 4  1 
A2 3  2 

Logic :

  • колонке «Количество» является количество раз «ид» повторяется
  • Колонка «count1» это количество строк, где возраст составляет менее 21

Текущий код:

library(dplyr) 
df_summarized <- df %>% 
        group_by(id) >%> 
        summarise(count = n(),count1 = count(age<21)) 

Проблема:

Error: no applicable method for 'group_by_' applied to an object of class "logical" 

ответ

2

Мы должны сделать sum

df %>% 
    group_by(id) %>% 
    summarise(count = n(),count1 = sum(age < 21)) 
# A tibble: 2 × 3 
#  id count count1 
# <chr> <int> <int> 
#1 A1  4  1 
#2 A2  3  2 

, как count относится к data.frame или tbl_df, а не только в одной колонке внутри summarise


Или с помощью data.table

library(data.table) 
setDT(df)[, .(count = .N, count1 = sum(age < 21)), id] 

Или с base R

cbind(count = rowSums(table(df[-2])), count1 = as.vector(rowsum(+(df$age < 21), df$id))) 
# count count1 
#A1  4  1 
#A2  3  2 

Или используя aggregate на основе sum

do.call(data.frame, aggregate(age~id, df, FUN = 
      function(x) c(count = length(x), count1 = sum(x<21)))) 

Примечание: Все вышеуказанные методы дают набор данных с правильными колоннами. Это будет особенно заметно в aggregate. То есть причина, по которой выходному столбцу т.е. матрицы преобразуется в собственные колонки с do.call(data.frame

4

С базой R, мы можем использовать aggregate, чтобы найти число строк для каждой группы (id), а также количества строк со значением меньше 21

aggregate(age~id, df, function(x) c(count = length(x), 
                count1 = length(x[x < 21]))) 

# id age.count age.count1 
#1 A1   4   1 
#2 A2   3   2