【问题标题】:How to count one column and adding up several columns at the same time using summarise in dplyr R如何使用 dplyr R 中的汇总计算一列并同时将多列相加
【发布时间】:2020-05-28 07:18:29
【问题描述】:

我有这个数据框(还有 20 列,如 class,但仅作为示例,我展示了一个简短版本):

 niv  ID  class1 class2 class3
  A   x    10      5      7
  A   y    15      3      1
  A   z    11      2      4
  B   u    17      7      3
  B   w    18      7      9

所以我想group_by(niv) 并总结ID 列,仅计算它和class1class2class3 列加起来只需一个命令。我试过summarise_each,但我不知道如何使用它。此外,当您有一个包含很多列的数据框时,目标是学习如何在汇总函数中混合不同的乐趣。

我需要的汇总数据框是这个:

 niv  n_ID  sum_class1 sum_class2 sum_class3
  A    3        36         10         12
  B    2        35         14         12

提前致谢。

【问题讨论】:

  • 这是我的,我发送了,但不完整,所以我删除了它以将其与所有内容一起发布。

标签: r dplyr


【解决方案1】:

我们可以使用summariseacross

library(dplyr)
df %>%
   mutate(n_ID = 1) %>%
   group_by(niv) %>%
   summarise(across(starts_with('class'), sum))

有了across,我们可以拥有多种功能

iris %>%      
   summarise(across(where(is.factor), nlevels), 
            across(where(is.numeric), mean))
#  Species Sepal.Length Sepal.Width Petal.Length Petal.Width
#1       3     5.843333    3.057333        3.758    1.199333

数据

df <- structure(list(niv = c("A", "A", "A", "B", "B"), ID = c("x", 
"y", "z", "u", "w"), class1 = c(10L, 15L, 11L, 17L, 18L), class2 = c(5L, 
3L, 2L, 7L, 7L), class3 = c(7L, 1L, 4L, 3L, 9L)), 
class = "data.frame", row.names = c(NA, -5L))

【讨论】:

  • 谢谢。我运行了代码并得到了这个:Error across (starts_with ("class"), sum): function "across" could not be found。另外,我希望未来的练习是学习如何在一个汇总函数中结合计数和求和。
  • @ErnestoRiverosBarrientos 该函数在新的 dplyr 包版本中。如果您需要最前沿,请安装开发版
  • 我明白了。你能帮我在哪里找到开发版吗?
  • @ErnestoRiverosBarrientos 你可以使用devtools::install_github("tidyverse/dplyr")(来自here
【解决方案2】:

您可以创建带有全 1 的 n_ID 列和带有所有 'class' 列的 sum 它们。

library(dplyr)

df %>%
 mutate(n_ID = 1) %>%
 group_by(niv) %>%
 summarise_at(vars(n_ID, starts_with('class')), sum)

# A tibble: 2 x 5
#  niv    n_ID class1 class2 class3
#  <chr> <dbl>  <int>  <int>  <int>
#1 A         3     36     10     12
#2 B         2     35     14     12

数据

df <- structure(list(niv = c("A", "A", "A", "B", "B"), ID = c("x", 
"y", "z", "u", "w"), class1 = c(10L, 15L, 11L, 17L, 18L), class2 = c(5L, 
3L, 2L, 7L, 7L), class3 = c(7L, 1L, 4L, 3L, 9L)), 
class = "data.frame", row.names = c(NA, -5L))

【讨论】:

  • 这可以解决它。但我也想探索在 summarise 函数中结合两种乐趣。
  • @ErnestoRiverosBarrientos 我不明白你想结合哪两个功能?您仅将 sum 函数应用于列 class1class2etc。
  • 我想使用两个函数:count niv 和对其他数字列求和。
  • @ErnestoRiverosBarrientos 是的,所以你实际上并没有组合两个函数,对吧?因为你只数一次。这给了你我的想法。我不太清楚你在找什么。
  • 我觉得@akrun建议的across函数可以在summary函数中组合几个函数。
猜你喜欢
  • 2022-08-16
  • 1970-01-01
  • 2022-11-15
  • 2020-12-04
  • 2016-12-29
  • 1970-01-01
  • 2014-12-02
  • 1970-01-01
  • 2018-07-06
相关资源
最近更新 更多