【问题标题】:Add a mean column to a table dataframe in R将平均列添加到 R 中的表数据框
【发布时间】:2021-08-06 06:29:38
【问题描述】:

我有一个数据框,例如:

   COL1 VALUE1 VALUE2
1   A,A      1      5
2 A,A,B      1      3
3     C      1      1
4     D      1      2
5     D      1      2
6   A,A      1     10
7 A,B,A      1      2

我可以成功删除 COL1 中的重复项,并使用以下方法计算 COL1 中不同重复项的数量:

as.data.frame(table(tab$COL1)) %>%
  group_by(Var1 = sapply(strsplit(as.character(Var1), ","), function(x) toString(unique(x)))) %>%
  summarise(Freq = sum(Freq))

然后我得到:

# A tibble: 4 × 2
  Var1   Freq
  <chr> <int>
1 A         2
2 A, B      2
3 C         1
4 D         2

但我想知道是否有人想添加一个名为 Mean 的新列,这将是每个 COL1 groupsVALUE2 值的平均值,然后得到:

  Var1      Freq  Mean 
1 A         2     7.5   < because (5+10)/2 =7.5
2 A, B      2     2.5   < because (3+2)/2 =2.5 
3 C         1     1     < because 1/1 = 1 
4 D         2     2     < because (2+2)/2 = 2

如果有帮助,这里是数据框:

structure(list(COL1 = structure(c(1L, 2L, 4L, 5L, 5L, 1L, 3L), .Label = c("A,A", 
"A,A,B", "A,B,A", "C", "D"), class = "factor"), VALUE1 = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L), VALUE2 = c(5L, 3L, 1L, 2L, 2L, 10L, 
2L)), class = "data.frame", row.names = c(NA, -7L))

【问题讨论】:

  • 嗨,我在预期输出中添加了评论来解释我是如何得到它的,实际上我只是为每个 COL1 组做 Value2 的平均值

标签: r dplyr


【解决方案1】:

您可以直接在dplyr链中计算频率表,然后在summarise()调用中添加一个Mean = mean(VALUE2)

tab %>%
    group_by(Var1 = sapply(strsplit(as.character(COL1), ","), function(x) toString(unique(x)))) %>%
    summarise(Freq = sum(VALUE1), Mean = mean(VALUE2))

# # A tibble: 4 x 3
#   Var1   Freq  Mean
#   <chr> <int> <dbl>
# 1 A         2   7.5
# 2 A, B      2   2.5
# 3 C         1   1  
# 4 D         2   2 

【讨论】:

    【解决方案2】:

    这是你想要的吗:

    library(dplyr)
    tab %>%
      mutate(COL1 = sapply(strsplit(as.character(COL1), ","), function(x) toString(unique(x)))) %>%
      group_by(COL1) %>%
      summarise(Freq = sum(VALUE1),
                Mean = mean(VALUE2))
    # A tibble: 4 x 3
      COL1   Freq  Mean
    * <chr> <int> <dbl>
    1 A         2   7.5
    2 A, B      2   2.5
    3 C         1   1  
    4 D         2   2  
    

    【讨论】:

    • 被打败了 31 秒!
    • 是的,太糟糕了。但没有问题。
    • 我赞成你的投票,因为你已经发现 OP 想要 VALUE1 的总和
    • 但还是对 OP 接受了你感到有点失望 ;)
    • 我屈服于@Sam,他还处于早期的 SO 职业生涯;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多