2014-03-24 182 views
1

好创建与购买频率信息的新data.frame更好的方法,这可能会遇到一个有点令人费解,但我会试着解释一下我的意思是:寻找从另一个data.frame

我有一个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

这里有一个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为特定产品构建数据框架,显示产品在数据集中找到的每个日期内至少在其类别中进行了一次购买的时间百分比?

谢谢!

回答

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] 
+0

'data.table'绝对是一种方法,但是,您的汇总操作不提供他想要的输出。 – stanekam

+0

@iShouldUseAName:是的,我花了一秒钟才意识到(自修) –

+0

@iShouldUseANameame和OP-你们两个的解决方案都很好。谢谢。他们只是两种做同样事情的方法(在R中看起来很常见)......即,有没有一个好处,你们都看到使用一个在另一个? – datahappy

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。你需要自己组建日期。

+0

实际上,这并没有给出所需的输出。看起来他想把它限制在'numbsold'不是0的情况下。 –

+0

好的呼叫。我现在要做出改变。 – stanekam