【问题标题】:Group by function query按功能分组查询
【发布时间】:2021-01-11 10:23:04
【问题描述】:

大家好,我是 R 新手,

虽然我附上了我正在使用的 df 的屏幕截图 (https://i.stack.imgur.com/CUz4l.png),但这里有一个简短的描述

我有一个共有 7 列的数据框,其中一列是月份列,其余 6 列是(整数)值,这些也有空行

需要按所有6列的计数汇总并按月分组

尝试了以下代码:group_by(Month) %>% summarise(count=n(),na.omit())

得到以下错误:
错误:summarise() 输入 ..2 有问题。 x 参数“对象”丢失,没有默认值 i 输入..2na.omit()。 i 错误发生在第 1 组:月 =“1”。 运行rlang::last_error() 看看哪里出错了。

有人可以帮忙吗?

[数据头][1] (https://i.stack.imgur.com/stfoG.png)

> dput(head(Dropoff))
structure(list(Start.Date = c("01-11-2019 06:07", "01-11-2019 06:07", 
"01-11-2019 06:08", "01-11-2019 06:08", "02-11-2019 06:08", "02-11-2019 06:07"
), End.Date = c("01-11-2019 06:12", "01-11-2019 09:28", "01-11-2019 10:02", 
"01-11-2019 13:05", "02-11-2019 06:13", "02-11-2019 06:16"), 
    Month = structure(c(3L, 3L, 3L, 3L, 3L, 3L), .Label = c("1", 
    "2", "11"), class = "factor"), nps = c(9L, 10L, 9L, 8L, 9L, 
    9L), effort = c(9L, 10L, 9L, 9L, 9L, 8L), knowledge = c(NA, 
    NA, 5L, NA, NA, 5L), confidence = c(5L, 5L, NA, NA, 5L, NA
    ), listening = c(NA, NA, NA, 5L, NA, NA), fcr = c(1L, 1L, 
    1L, 1L, 1L, 1L), fixing.issues = c(NA, NA, NA, NA, NA, NA
    )), row.names = c(NA, 6L), class = "data.frame")

id 喜欢输出看起来像这样

Month count of nps count of effort
1 xxx xxx
2 xxx xxx
11 6 6

....等等(计数)所有变量

以下

df%>% group_by(Month) %>% summarise(count=n())

提供此输出 [1]:https://i.stack.imgur.com/u3nxv.png 这不是我所希望的

【问题讨论】:

标签: r dplyr group-by summarize


【解决方案1】:

看起来na.omit() 在这种情况下会导致问题。鉴于您想计算 NA 但不将它们包含在任何以下总和中,您可以使用

df[is.na(df)] = 0

然后

df %>% group_by(Month) %>% summarise(count=n())

【讨论】:

  • 感谢马文,但这并没有帮助它所做的是按月分组并提供第一个变量的计数
  • 您对上面提供的示例数据的预期输出究竟是什么?
  • 好的,我需要弄清楚如何使用 cmets 部分来说明我的观点,有什么建议吗?
  • 将期望的结果添加到 op
  • 谢谢。还有一个问题:您如何定义“计数”?你想计算有多少条目是非 NA 的吗?还是一笔?
【解决方案2】:

感谢您的澄清。半手动解决方案

df %>% group_by(Month) %>% summarize(
  c_nps= sum(!is.na(nps)),
  c_effort= sum(!is.na(effort)),
  c_knowledge= sum(!is.na(knowledge)),
  c_confidence= sum(!is.na(confidence)),
  c_listening= sum(!is.na(listening)),
  c_fcr= sum(!is.na(fcr))
)

应该可以解决问题。由于只需要总结 6 列,因此我会使用手动规范而不是自动实现(即在所有其他列中计算非 NA)。

结果

# A tibble: 1 x 7
  Month c_nps c_effort c_knowledge c_confidence c_listening c_fcr
  <fct> <int>    <int>       <int>        <int>       <int> <int>
1 11        6        6           2            3           1     6

干杯,祝你好运!

【讨论】:

  • 谢谢马文,我也会用这个
【解决方案3】:

从您的示例中我了解到,您想计算每一列中的非 NA 值。

Dropoff %>% group_by(Month) %>%
summarise_at(vars(nps:fixing.issues), list(count=~sum(!is.na(.x))))
  • summarize_at:该术语对vars() 表达式中给出的每一列执行汇总。这里我选择了npsfixing.issues的所有列。
  • 作为汇总函数(描述如何汇总数据),我定义为对所有非 NA 值进行计数。语法是将所有函数作为命名列表。这里~function(x) 的作用相同。更冗长的写法是:function(x) sum(!is.na(x))
  • “count”表达式的工作方式如下:检查列 (x) 的向量是否为 NA 值 is.na! 否定这个表达式。由于这是一个只有真/假值的向量,您可以使用sum 计算真值。
  • 该表达式适用于所有类型的列类型(文本、数字等)

给出结果:

# A tibble: 1 x 8
  Month nps_count effort_count knowledge_count confidence_count listening_count fcr_count fixing.issues_count
  <fct>     <int>        <int>           <int>            <int>           <int>     <int>               <int>
1 11            6            6               2                3               1         6                   0

如果这不是您的目标,请准确说明您的问题。

【讨论】:

  • 那是完美的伴侣!非常感谢
  • 如果我的要求不高,请您分解一下这段代码的工作原理,以便我清楚吗?
  • 如果我们有一个字符变量列并且需要同样的计数,我们是否需要修改代码? (来自客户的文字反馈)
  • @IqbalS 我已经添加了一些解释。
  • 这真的很有帮助!感谢您的详细解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 2013-09-19
  • 1970-01-01
相关资源
最近更新 更多