【问题标题】:R dataframe: aggregate by group and convert to frequency countR数据框:按组聚合并转换为频率计数
【发布时间】:2021-08-19 02:32:02
【问题描述】:

我是 R 新手,想知道是否有人可以帮助我解决问题:

我有一个这样的数据框:

panelist_id type refer_sm refer_se
1 HP 1 0
1 HP 0 1
1 PB 0 1
2 PB 0 1
3 TN 1 0
3 HP 1 0

我想生成一个数据框,在 panelist_id 级别汇总每个小组成员的类型访问次数和“引用”类型的次数,例如:

panelist_id No. visits to type: HP No. visits to type PB No. visits to type TN No. refers from sm to HP No. refers from sm to PB No. refers from sm to TN No. refers from se to HP No. refers from se to PB No. refers from se to TN
1 2 1 0 1 0 0 1 1 0
2 0 1 0 0 0 0 0 1 0
3 1 0 1 1 0 1 0 0 0

我尝试过使用聚合和汇总函数,但没有取得多大成功。任何解决方案将不胜感激。谢谢

【问题讨论】:

    标签: r dataframe count aggregate


    【解决方案1】:

    这是tidyverse 的选项。创建一列 1 (n),然后使用 pivot_wider 将 names_from 指定为 'type' 和 values_from 使用 'n' 和 'refer' 列,将 values_fn 指定为 sum 和values_fill 为 0(在没有组合的情况下返回 0 - 默认情况下返回 NA)

    library(dplyr)
    library(tidyr)
    df1 %>%
         mutate(n = 1) %>% 
         pivot_wider(names_from = type, values_from = c(n, refer_sm, refer_se),
               values_fn = sum, values_fill = 0)
    

    -输出

    # A tibble: 3 x 10
    #  panelist_id  n_HP  n_PB  n_TN refer_sm_HP refer_sm_PB refer_sm_TN refer_se_HP refer_se_PB refer_se_TN
    #        <int> <dbl> <dbl> <dbl>       <int>       <int>       <int>       <int>       <int>       <int>
    #1           1     2     1     0           1           0           0           1           1           0
    #2           2     0     1     0           0           0           0           0           1           0
    #3           3     1     0     1           1           0           1           0           0           0
    

    数据

    df1 <- structure(list(panelist_id = c(1L, 1L, 1L, 2L, 3L, 3L), type = c("HP", 
    "HP", "PB", "PB", "TN", "HP"), refer_sm = c(1L, 0L, 0L, 0L, 1L, 
    1L), refer_se = c(0L, 1L, 1L, 1L, 0L, 0L)), 
    class = "data.frame", row.names = c(NA, 
    -6L))
    

    【讨论】:

      【解决方案2】:

      使用reshape + aggregate 的基本 R 选项

      reshape(
        aggregate(. ~ panelist_id + type, cbind(df, n = 1), sum),
        idvar = "panelist_id",
        timevar = "type",
        direction = "wide"
      )
      

      给予

        panelist_id refer_sm.HP refer_se.HP n.HP refer_sm.PB refer_se.PB n.PB
      1           1           1           1    2           0           1    1
      2           3           1           0    1          NA          NA   NA
      4           2          NA          NA   NA           0           1    1
        refer_sm.TN refer_se.TN n.TN
      1          NA          NA   NA
      2           1           0    1
      4          NA          NA   NA
      

      或者,我们可以使用xtabs

      cbind(
        xtabs(~ panelist_id + type, df),
        xtabs(refer_sm ~ ., aggregate(refer_sm ~ panelist_id + type, df, sum)),
        xtabs(refer_se ~ ., aggregate(refer_se ~ panelist_id + type, df, sum))
      )
      

      给予

        HP PB TN HP PB TN HP PB TN
      1  2  1  0  1  0  0  1  1  0
      2  0  1  0  0  0  0  0  1  0
      3  1  0  1  1  0  1  0  0  0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2013-07-24
        • 1970-01-01
        • 2022-12-24
        相关资源
        最近更新 更多