Суммирование счетных и условных агрегатных функций по одному и тому же коэффициенту
Быстро и короче, у меня возникают проблемы с суммированием счетных и агрегатных функций с условиями на один и тот же фактор.
Предположим, что у меня есть этот фрейм:
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):
У меня возникают проблемы с попыткой получить других. Думаю, мне нужно использовать трубных операторов? Если да, может ли кто-нибудь дать некоторые рекомендации?
Это то, что я пробовал, и это откровенно неправильно, но я не уверен, куда идти дальше:
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))
И да, я просмотрел документацию, и я уверен, что ответы есть, но они могут быть слишком продвинутыми для моего понимания. Спасибо заранее!
Ответы
Ответ 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)))