2015-05-31 1 views
0

Вычислительные медианы, как представляется, a bit of an achilles heel for R (то есть no data.frame method). Каков минимальный объем ввода, необходимый для получения медианов группы из фрейма данных с использованием dplyr?Групповые медианы из фрейма данных с использованием 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 

Каково наименьшее возможное временное решение здесь?

+1

Может быть, я здесь отсутствует трюк, но это не так, потому что 'is.character (my_data_groups_1_and_2 $ value)' is 'TRUE'? Добавление в мутацию и преобразование значения в double позволяет вычислять медианы для меня. – ivyleavedtoadflax

ответ

1

Как прокомментировал 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" ... 
+0

Спасибо, это прекрасно, гораздо проще, чем я думал. Я полностью упустил сообщение об ошибке типа «номер-как-символ» – Ben

Смежные вопросы