使用 dplyr 对数据框中的中位数进行分组

Group medians from a data frame using dplyr

计算中位数似乎是 a bit of an achilles heel for R (ie. no data.frame method)。使用 dplyr 从数据框中获取组中位数所需的最少输入量是多少?

my_data <- structure(list(group = c("Group 1", "Group 1", "Group 1", "Group 1", 
"Group 1", "Group 1", "Group 1", "Group 1", "Group 1", "Group 1", 
"Group 1", "Group 1", "Group 1", "Group 1", "Group 1", "Group 2", 
"Group 2", "Group 2", "Group 2", "Group 2", "Group 2", "Group 2", 
"Group 2", "Group 2", "Group 2", "Group 2", "Group 2", "Group 2", 
"Group 2", "Group 2"), value = c("5", "3", "6", "8", "10", "13", 
"1", "4", "18", "4", "7", "9", "14", "15", "17", "7", "3", "9", 
"10", "33", "15", "18", "6", "20", "30", NA, NA, NA, NA, NA)), .Names = c("group", 
"value"), class = c("tbl_df", "data.frame"), row.names = c(NA, 
-30L))

library(dplyr)  

# groups 1 & 2
my_data_groups_1_and_2 <- my_data[my_data$group %in% c("Group 1", "Group 2"), ]

# compute medians per group
medians <- my_data_groups_1_and_2 %>%
  group_by(group) %>%
  summarize(the_medians = median(value, na.rm = TRUE)) 

给出:

Error in summarise_impl(.data, dots) : 
  STRING_ELT() can only be applied to a 'character vector', not a 'double'
In addition: Warning message:
In mean.default(sort(x, partial = half + 0L:1L)[half + 0L:1L]) :
  argument is not numeric or logical: returning NA

这里最省力的解决方法是什么?

正如 ivyleavedtoadflax 所评论的那样,该错误是由于向 median 提供了非数字或非逻辑参数引起的,因为您的 value 列的类型为 character(您可以很容易地通过引用数字来判断它们不是 numeric)。这里有两个简单的方法可以解决它:

my_data %>% 
  filter(group %in% c("Group 1", "Group 2")) %>%
  group_by(group) %>%
  summarize(the_medians = median(as.numeric(value), na.rm = TRUE)) 

my_data %>% 
  filter(group %in% c("Group 1", "Group 2")) %>%
  mutate(value = as.numeric(value))  %>%
  group_by(group) %>%
  summarize(the_medians = median(value, na.rm = TRUE)) 

要检查数据中包含 type 列的结构,您可以方便地使用

str(my_data)
#Classes ‘tbl_df’ and 'data.frame': 30 obs. of  2 variables:
# $ group: chr  "Group 1" "Group 1" "Group 1" "Group 1" ...
# $ value: chr  "5" "3" "6" "8" ...