在单个列中平均多个值以在R中的整洁数据框中创建一个新变量

时间:2018-08-05 19:03:51

标签: r dplyr tidyverse

我的数据框看起来很整洁,如下所示:

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。我也乐于听取其他执行此操作的方法。

1 个答案:

答案 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))