寻找一种更好的方法来创建一个新的data.frame,其中包含来自另一个data.frame的购买频率信息

时间:2014-03-24 18:00:33

标签: r dataframe

好的,这可能会有点令人费解,但我会试着解释一下我的意思:

我有一个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,显示产品在数据集中找到的每个日期在其类别中至少进行一次购买的时间百分比?

谢谢!

2 个答案:

答案 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。您需要自己形成日期。