[英]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.