每月一个随机记录

时间:2015-01-25 16:00:53

标签: r

假设我们有以下数据框:

    ShippedDate        OrderID  Subtotal
1   1996-07-16 00:00:00 10248   440.00
2   1996-07-10 00:00:00 10249   1863.40
...
25  1996-08-06 00:00:00 10272   1456.00
26  1996-08-12 00:00:00 10273   2142.40
...
51  1996-09-11 00:00:00 10298   3127.00
52  1996-09-13 00:00:00 10299   349.50
...
78  1996-10-14 00:00:00 10325   1497.00
79  1996-10-14 00:00:00 10326   982.00
80  1996-10-14 00:00:00 10327   2262.50
81  1996-10-17 00:00:00 10328   1168.00
etc
  1. 如何为每个记录选择一个记录(随机)? 例如
  2. 1   1996-07-16 00:00:00 10248   440.00
    2   1996-08-12 00:00:00 10273   2142.40
    3   1996-09-13 00:00:00 10299   349.50
    4   1996-10-14 00:00:00 10327   2262.50
    
    1. 如何计算每个月的总和? 例如
    2. 
          1   1996-07 2303.4
          2   1996-08 3598.4
          3   1996-09 3476.5
          4   1996-10 5909.5
      

3 个答案:

答案 0 :(得分:3)

我建议您创建一个year-month变量,然后在所有其余操作中使用它,以避免一遍又一遍地重新计算它。

这是一种可能的data.table方法

创建变量

library(data.table)
setDT(df)[, YearMonth := paste0(year(ShippedDate), "-", month(ShippedDate))]

从每个月开始随机抽样

df[, .SD[sample(seq_len(.N), 1)], by=YearMonth]
#    YearMonth         ShippedDate OrderID Subtotal
# 1:    1996-7 1996-07-16 00:00:00   10248    440.0
# 2:    1996-8 1996-08-12 00:00:00   10273   2142.4
# 3:    1996-9 1996-09-11 00:00:00   10298   3127.0
# 4:   1996-10 1996-10-14 00:00:00   10326    982.0

每年的总和

df[, sum(Subtotal), by=YearMonth]
#    YearMonth     V1
# 1:    1996-7 2303.4
# 2:    1996-8 3598.4
# 3:    1996-9 3476.5
# 4:   1996-10 5909.5

答案 1 :(得分:1)

您可以选择每月和每年大小为n(在您的情况下为1)的随机样本(如果您的原始数据存储为df):

library(zoo)
library(dplyr)
df_g <- group_by(df, as.character(as.yearmon(ShippedDate)))

sample_n(df_g, n, replace = FALSE)

您可以按如下方式计算每月和每年的总和(使用提供的数据):

summarise(df_g, sum = sum(Subtotal))

Source: local data frame [4 x 2]

  year_mon    sum
1 Aug 1996 3598.4
2 Jul 1996 2303.4
3 Okt 1996 5909.5
4 Sep 1996 3476.5

答案 2 :(得分:0)

我会通过以下方式为每个月选择一个随机行:

df[tapply(1:nrow(df), substr(df$ShippedDate,1,7), FUN= sample, size= 1),]

获取每个月的小计列总数:

result <- tapply(1:nrow(df), substr(df$ShippedDate,1,7), FUN= sum)

如果您需要data.frame中的“结果”月份和总数:

data.frame(names(result), result)

我真的需要学习使用plyr,但是现在我正在努力学习普通的R。