R语言 对同一因子汇总计数聚合函数和条件聚合函数

am46iovg  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(121)

简单地说,我在总结条件相同的计数函数和聚合函数时遇到了问题。
假设我有这个 Dataframe :

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)))

它创建了这个 Dataframe (本质上):

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 )中获取以下所有信息:
1.每个价目表的计数(包括NA、False)
1.每个"NA"条件的计数
1.不含NA和False的平均价格
1.最高价格

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))

是的,我已经查阅了文档,我相信答案就在那里,但它们可能对我的理解来说太先进了。

qco9c6ql

qco9c6ql1#

假设您的原始数据集与您创建的数据集相似(即NAcharacter相同。您可以在使用read.table读取数据时指定na.strings。但是,我猜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)))

相关问题