Tidyverse резюмировать: новая сводная переменная в каждой итерации - PullRequest
2 голосов
/ 05 марта 2020

У меня есть проблема, которую я просто не могу решить.

Скажем, у меня есть все oop, как показано в минимальном рабочем примере ниже Я хочу, чтобы R делал для каждой итерации новую переменную "summary" (в этом примере "dogfood_items", "catfood_items" и "fishfood_items"), т.е. я не могу получить выражение "Summaze (str_ *) 1014 * (food [i], "items", sep = "_") = sum (items)) "для работы. Определение промежуточной переменной (например, <- str_ c (food [i], "items", sep = "_")), а затем запись суммирования (a = sum (items), к сожалению, также не работает. </p>

Что меня беспокоит, так это то, что "str_ c (food [1]," items "," sep = "_"), стоящий сам по себе, работает совершенно нормально. Он не работает в рамках суммирования ( ...).

У кого-нибудь есть идеи, как заставить это работать?

Пожалуйста, не обращайте на меня внимания sh. Я довольно новичок в 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 !

1 Ответ

1 голос
/ 05 марта 2020

Если мы хотим присвоить имена столбцам в 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))
...