【问题标题】:Is there any way to summarize by multiple groups of factors?有没有办法通过多组因素来总结?
【发布时间】:2020-04-14 05:31:55
【问题描述】:

我正在寻找一种方法,通过多个组(“season”、“meteo”)提取列模式(“meteo2”),这些组是我的数据帧“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")
> 

【问题讨论】:

  • 您可以使用dput 添加数据吗? dput(mydf) ?
  • 您好 Ronak,我发布了我的示例数据,不是完整数据,因为我尝试过,但发布时间太长。
  • 但这似乎适用于您的示例数据mydf_sample %&gt;% group_by(meteo, season) %&gt;% summarise(m=Mode(meteo2))
  • > mydf_sample %>% group_by(meteo, season) %>% summarise(m=Mode(meteo2)) 错误:列m 无法将组28 提升为字符警告:因素@987654327 @ 包含隐式 NA,考虑使用 forcats::fct_explicit_na > ## 我看到这条消息.. ##
  • 你可以试试mydf_sample %&gt;% group_by(meteo, season) %&gt;% summarise(m= as.character(Mode(meteo2))) 吗?

标签: r group-by dplyr


【解决方案1】:

示例数据未重现您的错误。

但是,如果您的目标是生成众数,则可以通过计算组合并取最常见的组合来更直接地实现这一点。

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

调用distinct 将采用它看到的第一个选项,这是最常见的,因为从arrange 降序排列。

在平局的情况下只会选择其中一个选项。如果这是一个问题,您可以通过一些调整来选择所有内容。

mydf %>%
  mutate(meteo = forcats::fct_explicit_na(meteo)) %>%
  count(meteo, season, meteo2) %>%
  group_by(meteo, season) %>%
  filter(n == max(n)) %>%
  ungroup() %>%
  select(-n)

【讨论】:

  • 谢谢,麦克斯金纳!它似乎工作!此外,有没有办法查看整个结果?我只看到了一部分。 “一个小标题:31 x 3 .... 还有 21 行”。
  • 太棒了!您可以看到更多行,但首先我建议将答案保存到一个变量:summary &lt;- mydf %&gt;% ...。然后您可以轻松打印更多行而无需重新计算:print(summary, n=100)。您可以将n 增加到nrow(summary) 以打印整个内容,但这可能非常大。这将显示 100 行,但您可以做更多。
  • @user2928318 太棒了!我很高兴听到一切都对你有用。当您有时间时,您是否介意接受这些答案之一,以便未来的浏览器知道在哪里寻找?
【解决方案2】:

从错误消息来看,似乎某些组没有返回字符值(可能是NA,它属于逻辑类)。您可以使用as.character 将它们显式转换为字符。

library(dplyr)

mydf_sample %>% group_by(meteo,season) %>% summarise(m=as.character(Mode(meteo2)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-15
    • 2012-04-18
    • 1970-01-01
    • 2023-02-17
    相关资源
    最近更新 更多