【问题标题】:sum a col from a grouped tibble从分组的小标题中求和一个 col
【发布时间】:2020-02-12 21:53:07
【问题描述】:

我有以下数据框:

library(tidyverse)
datasetmax <- data.frame(pearl = c('new','new','recurrent','recurrent','new'),
                         jam = c(10,20,30,40,50), 
                         dog = c(1,2,3,1,2),
                         stringsAsFactors = FALSE)

我将数据框分组为一个摘要:

datasetmax %>% 
  mutate(temple = ifelse(pearl == 'new', jam * 0.1, jam * 0.2)) %>% 
  group_by(pearl) %>% summarise(plus = sum(temple), weight = sum(jam*dog)/sum(dog))

我想要列权重的总和(两个值),应该是62.5

我尝试了以下代码:

datasetmax %>% 
  mutate(temple = ifelse(pearl == 'new', jam * 0.1, jam * 0.2)) %>% 
  group_by(pearl) %>% summarise(plus = sum(temple), weight = sum(jam*dog)/sum(dog)) %>% colSums(plus)

但它告诉我“加号”列不存在。为什么?你能帮我一把吗?谢谢。

【问题讨论】:

  • 您将 tidyverse 的非标准评估(即仅引用裸变量名)与基本 R 函数 colSums 混合在一起。但请注意,colSums 是对单列求和的奇怪选择。
  • 我会做 %>% summarise_if(is.numeric,sum) ... 而不是 %>% colSums(..)
  • 你好@DarrenTsai,谢谢你的回答,工作正常。
  • 您好@StupidWolf,为了解决您的想法,我尝试了summarise_if(is.numeric,sum) %&gt;% pull(plus),并给了我所需的价值。谢谢。
  • 组合起来没问题,但是功能不一样。 dplyr 像 verb(data, variable) 一样工作,而 base 通常像 function(data$variable) 一样工作。你试图做第一种方式,但你需要第二种方式。在这种特殊情况下,您只需执行datasetmax %&gt;% mutate(.....) %&gt;% pull(temple) %&gt;% sum()。

标签: r tidyverse


【解决方案1】:

类似这样的:

datasetmax %>% 
  mutate(temple = ifelse(pearl == 'new', jam * 0.1, jam * 0.2)) %>% 
  group_by(pearl) %>% summarise(plus = sum(temple), weight = sum(jam*dog)/sum(dog)) %>% 
  select(weight) %>% sum()

【讨论】:

  • 感谢@Orlando Sabogal 的时间和回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2020-05-11
相关资源
最近更新 更多