好的,这可能会有点令人费解,但我会试着解释一下我的意思:
我有一个data.frame,它告诉我几年中每天在不同会话中销售的不同类别的产品数量,并为每个类别中的每个产品提供一个True / False列,告诉我是否至少有一种产品在该会话中被出售。
这是一个小例子:
Year Month Day Session Number Sold At Least One of X
2014 1 15 19876 10 True
2014 1 15 25698 10 False
2014 1 15 2156 2 True
2014 1 16 21578 0 False
2014 1 16 1123 12 False
2014 1 16 15469 25 True
2014 1 16 32654 0 False
2014 1 17 12589 8 True
2014 1 18 54269 4 True
2014 1 18 25136 14 True
因此,对于第一次观察,此类别中有10个项目已售出,其中至少有一个是产品X.在下一个会话中,该类别中有10个已售出,但没有一个是产品X. / p>
这是上表的dput():
structure(list(year = c(2014, 2014, 2014, 2014, 2014, 2014, 2014,
2014, 2014, 2014), month = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1), day = c(15,
15, 15, 16, 16, 16, 16, 17, 18, 18), session = c(19876, 25698,
2156, 21578, 1123, 15469, 32654, 12589, 54269, 25136), numbsold = c(10,
10, 2, 0, 12, 25, 0, 8, 4, 14), min1x = structure(c(2L, 1L, 2L,
1L, 1L, 2L, 1L, 2L, 2L, 1L), .Label = c("False", "True"), class = "factor")), .Names = c("year",
"month", "day", "session", "numbsold", "min1x"), row.names = c(NA,
-10L), class = "data.frame")
所以,我正在制作data.frames,显示X是至少每年在其类别中购买的产品之一的时间百分比。我希望得到以下输出:
Date Frequency Sold
2014-01-15 0.6666667
2014-01-16 0.5000000
2014-01-17 1.0000000
2014-01-18 0.5000000
由于我对R的知识非常有限(我正在学习,但很慢),我知道可以这样做:
myout<-data.frame(c("1/15/2014","1/16/2014","1/17/2014","1/18/2014"),
c(sum(mydf$min1x=="True" & mydf$year==2014 & mydf$month==1 & mydf$day==15)
/sum(mydf$numbsold > 0 & mydf$year==2014 & mydf$month==1 & mydf$day == 15)
,sum(mydf$min1x=="True" & mydf$year==2014 & mydf$month==1 & mydf$day==16)
/sum(mydf$numbsold > 0 & mydf$year==2014 & mydf$month==1 & mydf$day == 16)
,sum(mydf$min1x=="True" & mydf$year==2014 & mydf$month==1 & mydf$day==17)
/sum(mydf$numbsold > 0 & mydf$year==2014 & mydf$month==1 & mydf$day == 17)
,sum(mydf$min1x=="True" & mydf$year==2014 & mydf$month==1 & mydf$day==18)
/sum(mydf$numbsold > 0 & mydf$year==2014 & mydf$month==1 & mydf$day == 18)))
names(myout)<-c("Date","Frequency Sold")
myout$Date<-as.Date(myout$Date, "%m/%d/%Y")
我基本上重复命令并强制它一次一天构建data.frame。当然,在两年的时间内完成这项工作,并且很多产品会在很短的时间内完成。
我可以使用什么来告诉R为特定产品构建data.frame,显示产品在数据集中找到的每个日期在其类别中至少进行一次购买的时间百分比?
谢谢!
答案 0 :(得分:3)
使用data.table
包(您必须安装)可以很好地解决此问题。
首先在年,月和日列中创建日期列:
mydf$Date = as.Date(paste(mydf$year, mydf$month, mydf$day, sep="-"))
然后将其转换为data.table
:
library(data.table)
mydt = as.data.table(mydf)
然后您可以使用以下方法执行此摘要操作:
mydt[, list(FrequencySold=mean(min1x[numbsold > 0] == "True")), by=Date]
答案 1 :(得分:1)
require(plyr)
df$min1x <- as.logical(df$min1x)
ddply(df[df$numbsold > 0, ], .(year, month, day), summarize, frequency=sum(min1x) / length(min1x) )
df
是您提供的data.frame
。您需要自己形成日期。