Подтвердить что ты не робот

Суммирование счетных и условных агрегатных функций по одному и тому же коэффициенту

Быстро и короче, у меня возникают проблемы с суммированием счетных и агрегатных функций с условиями на один и тот же фактор.

Предположим, что у меня есть этот фрейм:

library(dplyr)

df = tbl_df(data.frame(
    company=c("Acme", "Meca", "Emca", "Acme", "Meca", "Emca"), 
    year=c("2011", "2010", "2009", "2011", "2010", "2013"), 
    product=c("Wrench", "Hammer", "Sonic Screwdriver", "Fairy Dust", 
              "Kindness", "Helping Hand"), 
    price=c("5.67", "7.12", "12.99", "10.99", NA, FALSE)))

который создает этот файл данных (по существу):

   company year  product             price
1    Acme  2011  Wrench              5.67
2    Meca  2010  Hammer              7.12
3    Emca  2009  Sonic Screwdriver   12.99
4    Acme  2011  Fairy Dust          10.99
5    Meca  2010  Kindness            NA
...  ...   ...   ...                 ...
n    Emca  2013  Helping Hand        FALSE

Скажем, я хочу df <- group_by(df, company, year, product), а затем получить следующую информацию в одной коллекции (т.е. dataframe):

  • Количество каждого листинга (включая NA, False)
  • Число каждого с условием "NA"
  • Средняя цена за исключением NA и False
  • Максимальная цена

    summarize(df, count = n()) #satisfies first item obviously
    

У меня возникают проблемы с попыткой получить других. Думаю, мне нужно использовать трубных операторов? Если да, может ли кто-нибудь дать некоторые рекомендации?

Это то, что я пробовал, и это откровенно неправильно, но я не уверен, куда идти дальше:

 summarize(df,
           total.count = n(),
           count = filter(df, is.na(price)),
           avg.price = filter(df, !is.na(price), price != FALSE),
           max.price = max(filter(df, !is.na(price), price != FALSE))

И да, я просмотрел документацию, и я уверен, что ответы есть, но они могут быть слишком продвинутыми для моего понимания. Спасибо заранее!

4b9b3361

Ответ 1

Предполагая, что ваш исходный набор данных подобен созданному вами (т.е. с NA как character. Вы можете указать na.strings при чтении данных с помощью read.table. Но, я думаю, NAs будут обнаружены автоматически.

Столбец price - factor, который необходимо преобразовать в класс numeric. Когда вы используете as.numeric, все нечисловые элементы (т.е. "NA", FALSE) получают предупреждение с NA) с предупреждением.

library(dplyr)
df %>%
     mutate(price=as.numeric(as.character(price))) %>%  
     group_by(company, year, product) %>%
     summarise(total.count=n(), 
               count=sum(is.na(price)), 
               avg.price=mean(price,na.rm=TRUE),
               max.price=max(price, na.rm=TRUE))

данные

Я использую ту же dataset (кроме строки ...), которая была показана.

df = tbl_df(data.frame(company=c("Acme", "Meca", "Emca", "Acme", "Meca","Emca"),
 year=c("2011", "2010", "2009", "2011", "2010", "2013"), product=c("Wrench", "Hammer",
 "Sonic Screwdriver", "Fairy Dust", "Kindness", "Helping Hand"), price=c("5.67",
 "7.12", "12.99", "10.99", "NA",FALSE)))