【问题标题】:Averaging specific row values to create new column in R平均特定行值以在 R 中创建新列
【发布时间】:2018-04-26 15:52:38
【问题描述】:

我正在尝试组合特定问题以形成新的组合问题,其值是组合问题的平均值。我只想要特定 id 的平均值。在下面的示例中,我尝试将问题 1 和 2(abc 和 def)组合起来,然后生成一个包含每个参与者的两个值的平均值的列(由 id 表示)。

这是原始数据框的示例:

id  question  qnumber  value
1   abc       1        1
1   def       2        3
1   ghi       3        4
2   abc       1        2
2   def       2        4
2   ghi       3        1

这就是我希望数据框的样子。

id  question  qnumber  value
1   abcdef    1        2
1   ghi       3        4
2   abcdef    1        3
2   ghi       3        1

在我的实际数据集中,我有 17 个问题,我想组合 3 对问题,产生 14 个问题(11 个独立问题和 3 个来自组合问题)。我不在乎生成的“问题”列是否具有与上述相同样式组合的问题名称,但我认为这会使事情更容易理解。 qnumber 列不是很重要,但我不确定基于数字(如“qnumber”)而不是基于字符串(如“问题”),所以我把它包括在内。

【问题讨论】:

    标签: r average tidyverse


    【解决方案1】:

    我会使用来自 dplyr 的有用的 case_when() 来解决这个问题。

    library(tidyverse)
    
    
    df <- tribble(~id,  ~question,  ~qnumber,  ~value,
                  1,   "abc",       1,        1,
                  1,   "def",       2,        3,
                  1,   "ghi",       3,        4,
                  2,   "abc",       1,        2,
                  2,   "def",       2,        4,
                  2,   "ghi",       3,        1)
    
    df %>%
        mutate(question = case_when(question %in% c("abc",
                                                    "def") ~ "abcdef",
                                    TRUE ~ question)) %>%
        group_by(id, question) %>%
        summarise(value = mean(value)) %>%
        ungroup
    #> # A tibble: 4 x 3
    #>      id question value
    #>   <dbl> <chr>    <dbl>
    #> 1    1. abcdef      2.
    #> 2    1. ghi         4.
    #> 3    2. abcdef      3.
    #> 4    2. ghi         1.
    

    reprex package (v0.2.0) 于 2018 年 4 月 26 日创建。

    【讨论】:

    • 当我到达以“summarise”开头的行时,这只会导致一个空白值列。它不填充值列。你知道为什么会这样吗?
    • 你的意思是你的真实数据,还是你说你不能在这里重现这个例子?
    • 我的意思是我的真实数据。但是,我看不到我的真实数据和您的示例之间存在有意义的差异,所以我不确定为什么它不起作用。
    • 是否有 NA 值?试试value = mean(value, na.rm = TRUE)
    • 如果不设置,最终数据框仍将按id 分组,因为我们需要group_by(id, question)。所以这取决于你接下来将如何处理这些数据!
    【解决方案2】:

    这是解决问题的一种方法,使用tidyverse 和查找向量来处理问题组合。

    dat <- read.table(text = "id  question  qnumber  value
    1   abc       1        1
                      1   def       2        3
                      1   ghi       3        4
                      2   abc       1        2
                      2   def       2        4
                      2   ghi       3        1", header = T, stringsAsFactors = FALSE)
    
    library(tidyverse)
    
    
    # set up named vector for combining (flexible in the real world with more pairs)
    lu <- rep("abcdef", 2) %>% set_names(c("abc", "def"))
    
    
    dat %>% mutate(new_question = ifelse(question %in% names(lu), # add in new column for combination
                                         lu[question],
                                         question)) %>%
        group_by(new_question, id) %>% # group via relevant columns: id and new_question
        summarise(avg_val = mean(value)) # calculate your averages
    
    # A tibble: 4 x 3
    # Groups:   new_question [?]
      new_question    id avg_val
             <chr> <int>   <dbl>
    1       abcdef     1       2
    2       abcdef     2       3
    3          ghi     1       4
    4          ghi     2       1
    

    这里我删除了qnumber,因为它并不重要,在总结之后添加回来可能更有意义。

    【讨论】:

      猜你喜欢
      • 2020-08-22
      • 2021-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2019-12-28
      • 1970-01-01
      相关资源
      最近更新 更多