【问题标题】:Take mean based on each group for each day in R在R中的每一天根据每个组取平均值
【发布时间】:2020-07-29 10:27:57
【问题描述】:

我有一个加密货币返回值的数据框,每个都根据价格分为 5 个一组(数据框有 1,847,012 个条目)

2014-01-02  XRP         0.064041998     1
2014-01-02  Dogecoin    -0.220306670    1
2014-01-02  FLO         0.043457042     1
2014-01-02  CasinoCoin  -0.080614279    2
2014-01-02  Nxt         0.048375563     2
2014-01-02  Quark       0.004495892     2
2014-01-02  Feathercoin 0.218078384     3
2014-01-02  Diamond     0.052490183     3
2014-01-02  Unobtanium  -0.107420249    4
2014-01-02  Peercoin    0.263435789     4
2014-01-02  Primecoin   0.230874782     4
2014-01-02  Bitcoin     0.039387728     5
2014-01-02  Litecoin    0.045263780     5
2014-01-02  Namecoin    0.318292245     5
2014-01-02  Ethereum    NA              NA
  ...        ...           ...         ...
2014-01-03  XRP         -0.03900908     1
2014-01-03  Dogecoin    -0.15273525     1
2014-01-03  FLO         0.02397348      1
2014-01-03  CasinoCoin  0.05748349      2
  ...        ...           ...         ...

截至 2019 年 12 月 31 日的日期(如果当时不存在代币,则某些值不可用,例如 2014 年的以太坊)。

我想要做的是创建一个表格,每天取每个组的平均值,所以

        2014-01-02         2014-01-03          2014-01-04     ...
1       mean(group 1)      mean(group 1)
2       mean(group 2)      mean(group 2)
3       mean(group 3)      mean(group 3)
4       mean(group 4)      mean(group 4)
5       mean(group 5)      mean(group 5)

我试图查找并找到Aggregate / summarize multiple variables per group (e.g. sum, mean) 我尝试的是:

means = as.data.frame(aggregate(d$value, list(d$Group), mean, na.rm = TRUE)) 

但这仅适用于所有日期的每个组,并且总共给我 5 个值,我每天需要 5 个值

Group.1    x
1          -4.920999e-03
2          -3.372798e-03
3          -1.548296e-03
4          -5.959693e-05
5          6.303165e-04

我也尝试过使用data.table

df3 <- setDT(d)[, lapply(.SD, mean), by=.(date, Group), .SDcols=c("date","Group")]

但这无法读取日期

【问题讨论】:

    标签: r data.table aggregate grouping mean


    【解决方案1】:

    关于data.table 方法,我认为您的SDcols 是错误的。

    library(data.table)
    setDT(d)
    d[,date := as.Date(date)]
    d[, lapply(.SD, mean, na.rm = TRUE), by= c("date","Group"), .SDcols=c("value")]
    

    如果我理解正确,您想按dategroup 分组并在value 列上应用平均值(如果需要,更改名称)

    这会给你一个长格式的数据。如果你想要一个宽格式的数据,你可以使用dcast。这种味道的东西:

    dcast(data_long, Group ~ date)
    

    示例

    library(data.table)
    d = data.table(date = as.Date(c("2014-01-02", "2014-01-03")),
                   Group = c('XRP','bitcoin'),
                    value = c(0.064041998, 1))
    
    data_long <- d[, lapply(.SD, mean, na.rm = TRUE), by= c("date","Group"), .SDcols=c("value")]
    data_long
             date   Group    value
    1: 2014-01-02     XRP 0.064042
    2: 2014-01-03 bitcoin 1.000000
    

    如果你想要宽格式的数据,你可以这样做:

    dcast(data_long, Group ~ date)
    Group 2014-01-02 2014-01-03
    1:     XRP   0.064042         NA
    2: bitcoin         NA          1
    

    【讨论】:

    • 是的,你是对的。它现在可以编译。现在似乎存在一个问题,即很多组只返回一个 NA 值,即使该组中有几个硬币在那个日期具有值。
    • 在这种情况下,您需要将 na.rm = TRUE 添加到 lapply 中的参数中。看我的更新。它解决了你的问题吗?
    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多