平均特定行值以在R

时间:2018-04-26 15:52:39

标签: r average tidyverse

我正在尝试将特定问题组合在一起,形成新的组合问题,其中的值是所合并问题的平均值。我只想要特定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个来自组合问题)。我不在乎最终的"问题" column将问题名称组合成与上面相同的样式,但我认为这会使事情更容易理解。 qnumber列并不是非常重要,但我不确定是否更容易根据数字组合某些行(如" qnumber")而不是字符串的基础(如"问题"),所以我把它包括在内。

2 个答案:

答案 0 :(得分:3)

以下是解决问题的一种方法,使用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,因为它并不重要,在总结之后将它添加回来会更有意义。

答案 1 :(得分:3)

我会使用来自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-04-26。