繁体   English   中英

在R中分组和计数

[英]Grouping and counting in R

我有一个Shell程序来执行以下操作,但是我想尝试使用R,但是我很困惑。

我的数据集如下所示:

 <date>      <car>        <sale>   
 2014-05-08 mercedes-450  40000
 2014-05-08 mercedes-350  30000
 2014-05-08 mercedes-350  30000
 2014-05-08 toyota corolla 20000
 2014-05-08 toyota camry   30000
 2014-05-09 mercedes-450  40000
 2014-05-09 mercedes-450  40000

我想将其转换为2个数据框,一个用于奔驰,一个用于丰田。

所以对于奔驰:

 2014-05-08 mercedes  100000
 2014-05-09 mercedes  80000

对于丰田:

 2014-05-08 toyota  50000

我需要执行此操作,以便可以在单独的图表上绘制丰田和梅赛德斯的销量,x轴上的日期为y。

如何创建两个数据框? 我尝试了ddply,但是我得到的只是一个数据跟踪,看起来像这样

 ddply(sales,c("date","car_type"),numcolwise(sum))

 2014-05-08 mercedes-450  40000
 2014-05-08 mercedes-350  60000
 2014-05-08 toyota corolla  20000
# sample data
set.seed(1)
df = data.frame(date = rep(as.Date(c("10jan1970", "11jan1970", "31mar1960", "30jul1960"), "%d%b%Y"), 2),
                type = sample(1:2, 8, replace=T),
                sales = rnorm(8))

# "aggreate()" to calculate your daily sales
agg = aggregate(sales ~ date + type, data=df, FUN=sum)

# "split()" the result by type if you want different data frames for each type
tabs = split(agg, f=agg$type)
tabs

# $`1`
#         date type      sales
# 1 1970-01-10    1  0.9052891
# 2 1970-01-11    1 -0.8204684
#
# $`2`
#         date type      sales
# 3 1960-03-31    2  1.9992102
# 4 1960-07-30    2  1.1281679
# 5 1970-01-11    2 -0.3053884

加载数据帧:

df <- data.frame(
  date = c("2014-05-08","2014-05-08","2014-05-08","2014-05-08","2014-05-08","2014-05-09","2014-05-09"),
  car = c("mercedes-450","mercedes-350","mercedes-350","toyota corolla","toyota camry","mercedes-450","mercedes-450"),
  sale = c(40000,30000,30000,20000,30000,40000,40000),stringsAsFactors=FALSE)

通过用“-”和“”分隔汽车变量来为汽车制造创建一个新变量:

splitstring <- strsplit(df$car," |-")
df$make <- unlist(lapply(splitstring,"[[",1))

加载我们将用于计算分组总和的dplyr软件包:

library(dplyr)

按天计算按销售额计算的总和:

results <- df %>%
  group_by(date,make) %>%
  summarise(total_sales = sum(sale))

现在,如果您希望每个制造商使用不同的图表,则可以将make用作ggplot2类的包中的facet变量,并将数据保存在单个表中。 但是,如果您想为每个品牌使用不同的表

tables <- split(results,results$make)

ddply解决方案:

library(plyr)

A<-df[grep("mercedes", df$car), ]
B<-df[grep("toyota", df$car), ]

ddply(A, .(date), summarize, val = sum(sale)) 
ddply(B, .(date), summarize, val = sum(sale)) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM