我正在尝试将特定问题组合在一起,形成新的组合问题,其中的值是所合并问题的平均值。我只想要特定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")而不是字符串的基础(如"问题"),所以我把它包括在内。
答案 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。