【问题标题】:Tidyverse summarize: a new summary variable within each iterationTidyverse summarise:每次迭代中的一个新的汇总变量
【发布时间】:2020-06-17 12:50:37
【问题描述】:

我确实有一个似乎无法解决的问题。

假设我有一个类似于下面最小工作示例提供的循环。 我想要 R 做的是为每次迭代创建一个新的“summary”(在本例中为“dogfood_items”、“catfood_items”和“fishfood_items”)变量,即我无法获得表达式“summarize(str_c( food[i], "items", sep="_") = sum(items))" 工作。 定义一个临时变量(例如 a

让我烦恼的是,“str_c(food[1], "items", "sep="_") 独立运行确实可以正常工作。它在summarize(...) 中不起作用。

有没有人知道如何让它工作?

请不要对我太苛刻。我对 R 很陌生。

最好的祝愿,大卫。

library(tidyverse)

food <- c("dogfood", "catfood", "fishfood")
output <- list()

data <- tribble(
  ~items, ~cost, ~staff, ~foodtype,
  100, 200, 11, "dogfood", 
  120, 20, 12, "dogfood",
  40, 120, 12, "catfood", 
  10, 12, 13, "fishfood",
)

data # view data

for (i in seq_along(food))
  output[[i]] <- data %>%
  filter(foodtype==food[i]) %>%
  summarise(str_c(food[i], "items", sep="_")=sum(items)) # the problem is here !

【问题讨论】:

  • 您是否要按食物类型汇总项目?可能有比循环更好的解决方案,比如group_by()

标签: r tidyverse summarize


【解决方案1】:

如果我们想在赋值的 lhs 上命名列,请使用 := 并评估 (!!)

library(dplyr)
library(stringr)
output <- vector('list', length(food))
for (i in seq_along(food)) {
   output[[i]] <- data %>%
   filter(foodtype==food[i]) %>%
   summarise(!! str_c(food[i], "items", sep="_") := sum(items))
 }

output
#[[1]]
# A tibble: 1 x 1
#  dogfood_items
#          <dbl>
#1           220

#[[2]]
# A tibble: 1 x 1
#  catfood_items
#          <dbl>
#1            40

#[[3]]
# A tibble: 1 x 1
#  fishfood_items
#           <dbl>
#1             10

通过sum操作做组可能更容易

data %>%
     group_by(foodtype) %>%
     summarise(out = sum(items))

【讨论】:

  • 亲爱的akrun,非常感谢。我在这个问题上花了很多时间。你是我个人的英雄。谢谢,这是我一直在寻找的。​​span>
  • @David 谢谢你的好消息。很高兴知道它对您有帮助
猜你喜欢
  • 2019-01-19
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2019-01-17
  • 2014-12-01
  • 1970-01-01
  • 2021-09-27
相关资源
最近更新 更多