我的数据框看起来很整洁,如下所示:
id item value
1 e_o 4
1 e_f 6
1 e_c 5
1 e_lab 5
2 e_o 1
2 e_f 5
2 e_c 3
2 e_c 4
我的目标是执行t.test,以比较e_o,e_f和e_c值的平均值与e_lab的值。我正在尝试确定操作数据的最佳方法。
具体来说,我不确定通过保持整齐的格式并创建一个新的“ item”变量(例如e_all)来创建e_o,e_f和e_c的平均值是否更好(或可行),或者我是否应该传播数据以使其脱离整齐的格式,然后收集该数据以使其恢复为该格式。
理想情况下,我最终得到一个看起来像这样的数据框。 对我平均e_o,e_f和e_c来添加e_all变量的最佳方法是什么?
id item value
1 e_o 4
1 e_f 6
1 e_c 5
1 e_all 5
1 e_lab 5
2 e_o 1
2 e_f 5
2 e_c 3
2 e_all 3
2 e_lab 4
通过此设置,我将使用过滤器功能创建两个单独的数据框,一个仅包含e_all的值,另一个仅包含e_lab的值。然后,我将使用这两个单独的数据帧执行t.test。我也乐于听取其他执行此操作的方法。
答案 0 :(得分:3)
一个选择是filter
代表'e_f','e_o','e_c'的'item',按mean
分组,并将行与原始数据集绑定
library(tidyverse)
df1 %>%
filter(item %in% c("e_o", "e_f", "e_c")) %>%
group_by(id, item = "e_all") %>%
summarise(value = mean(value)) %>%
bind_rows(df1) %>%
arrange(id, str_detect(item, "lab|all"))
# A tibble: 11 x 3
# Groups: id [2]
# id item value
# <int> <chr> <dbl>
# 1 1 e_o 4
# 2 1 e_f 6
# 3 1 e_c 5
# 4 1 e_all 5
# 5 1 e_lab 5
# 6 2 e_o 1
# 7 2 e_f 5
# 8 2 e_c 3
# 9 2 e_c 4
#10 2 e_all 3.25
#11 2 e_lab 4
df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), item = c("e_o",
"e_f", "e_c", "e_lab", "e_o", "e_f", "e_c", "e_c", "e_lab"),
value = c(4L, 6L, 5L, 5L, 1L, 5L, 3L, 4L, 4L)),
.Names = c("id", "item", "value"),
class = "data.frame", row.names = c(NA, -9L))