Есть ли способ суммировать по нескольким группам факторов? - PullRequest
0 голосов
/ 14 апреля 2020

Я ищу способ извлечь режим столбца ("meteo2") по нескольким группам ("season", "meteo"), которые являются форматом факторов в моем фрейме данных, "mydf". Вот мой тестовый код, как показано ниже, но он не работает, в результате появляется сообщение об ошибке. С одной группой «сезон» это работает. Все три столбца имеют значения «NA». Я не уверен, какая часть неверна в моем коде. Любая помощь очень приветствуется!

str(mydf$season)
Factor w/ 4 levels "Spring","Summer",...:
 str(mydf$meteo)
Factor w/ 7 levels "<40","<50","<60",..: 
str(mydf$meteo2)
Factor w/ 4 levels "E","N","S","W": 

# mode function
Mode = function(x){ 
ta = table(x)
tam = max(ta)
if (all(ta == tam))
     mod = NA
else
     if(is.numeric(x))
mod = as.numeric(names(ta)[ta == tam])
else
     mod = names(ta)[ta == tam]
return(mod)}

# extracting mode
dataSummary<-mydf %>% select(season, meteo, meteo2) %>%
mutate(meteo = forcats::fct_explicit_na(meteo)) %>%
group_by(meteo, season) %>%
summarise(m=Mode(meteo2))

dataSummary
error : Column `m` can't promote group 30 to character

Вот мои примеры данных.

dput(head(mydf_sample))
structure(list(season = structure(c(3L, 3L, 3L, 3L, 3L, 3L), .Label = c("Spring", 
"Summer", "Fall", "Winter"), class = "factor"), meteo2 = structure(c(2L, 
2L, 2L, 1L, 2L, 2L), .Label = c("E", "N", "S", "W"), class = "factor"), 
    meteo = structure(c(6L, 6L, 6L, 6L, 7L, 7L), .Label = c("<40", 
    "<50", "<60", "<70", "<75", "<80", "80+"), class = "factor")), .Names = c("season", 
"meteo2", "meteo"), row.names = c(NA, 6L), class = "data.frame")
> 

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Из сообщения об ошибке кажется, что некоторые группы не возвращают символьные значения (вероятно, NA, который имеет логический класс). Вы можете явно превратить их в символы, используя as.character.

library(dplyr)

mydf_sample %>% group_by(meteo,season) %>% summarise(m=as.character(Mode(meteo2)))
1 голос
/ 14 апреля 2020

Ваша ошибка не была воспроизведена с примерами данных.

Но если ваша цель - создать режим, это возможно более непосредственно, подсчитав комбинации и выбрав наиболее распространенную.

mydf %>%
  mutate(meteo = forcats::fct_explicit_na(meteo)) %>%
  count(meteo, season, meteo2) %>%
  arrange(desc(n)) %>%
  distinct(meteo, season, .keep_all = TRUE) %>%
  select(-n)

Вызов отдельный примет первый вариант, который он увидит, который является наиболее распространенным из-за нисходящего порядка из range .

, который выберет только один из вариантов в случае галстуков. Если это вызывает озабоченность, вы можете выбрать все с небольшой настройкой.

mydf %>%
  mutate(meteo = forcats::fct_explicit_na(meteo)) %>%
  count(meteo, season, meteo2) %>%
  group_by(meteo, season) %>%
  filter(n == max(n)) %>%
  ungroup() %>%
  select(-n)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...