R - «назначить» функцию для расчета типа суммирования - PullRequest
0 голосов
/ 23 марта 2020

Я использовал этот код для запуска сумм

Сначала несколько фиктивных данных-

Y <- c(356,392,127,127,437,392,392,450,155,181)
YearWeek <- c(201602,201602,201603,201603,201604,201604,201604,201605,201605,201605)
df <- as.data.frame(cbind(YearWeek,Y))
weeks <- as.data.frame(unique(df$YearWeek))

Вот текущий код для вычисления сумм

Container_weeks <- c()
for (i in 1:nrow(weeks)) {Container_weeks [i] <- sum(df$Y[df$YearWeek==weeks[i,]  ], na.rm = FALSE) }

результатов

Container_weeks
[1]  748  254 1221  786

Я знаю, что это можно сделать разными способами, но мне нужно специально использовать функцию assign вместо приведенного выше кода. Я попробовал этот код ниже, но он не работает.

for (i in 1:nrow(weeks)) {assign(Container_weeks[i], sum(df$Y[df$YearWeek==weeks[i,] ], na.rm = FALSE)) }

Я получаю это сообщение об ошибке

Error in assign(Container_weeks[i], sum(df$Y[df$YearWeek == weeks[i, ]],  : 
  invalid first argument

Я перепробовал все возможные конфигурации в функции назначения, такие как "Container_weeks" [i] "," Container_weeks "[i] et c. но ничего не работает. Можно ли это сделать с помощью assign? Как уже упоминалось, вычисление суммы может быть выполнено многими способами, но мне нужно использовать assign , чтобы я мог адаптировать ее к другим частям кода и используемой мной автоматизации. Любая помощь очень ценится. Заранее спасибо.

Ответы [ 2 ]

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

Мы можем использовать группу по sum

library(dplyr)
df %>%
   group_by(YearWeek) %>%
   summarise(Y = sum(Y))

Или с aggregate

aggregate(Y ~ YearWeek, df, sum)

В коде ОП 'Container_weeks' это цифра c. Поэтому его следует преобразовать в character

Container_weeks <- c()
for (i in 1:nrow(weeks)) {Container_weeks [i] <- 
       sum(df$Y[df$YearWeek==weeks[i,]  ], na.rm = FALSE) }
for (i in 1:nrow(weeks)) {
    assign(as.character(Container_weeks[i]), 
           sum(df$Y[df$YearWeek==weeks[i,] ], na.rm = FALSE))
     }

`748`
#[1] 748
`254`
#[1] 254

ПРИМЕЧАНИЕ. Не рекомендуется иметь несколько объектов в глобальной среде. Кроме того, присвоение объекту с именем, начинающимся с цифры c, затруднит его использование, поскольку для него требуются обратные кавычки

Если целью является создание имен объектов с уникальными значениями 'недель', и т. Д. c , используйте paste

for (i in 1:nrow(weeks)) {
    assign(as.character(unlist(weeks[i,])), 
           sum(df$Y[df$YearWeek==weeks[i,] ], na.rm = FALSE))
     }

`201602`
#[1] 748
`201603`
#[1] 254

ПРИМЕЧАНИЕ: Здесь мы использовали пример ОП и смогли создать объекты в глобальном env

data

df <- data.frame(YearWeek, Y)
0 голосов
/ 23 марта 2020

Мне предоставили некоторые изменения в моем ответе. Я неправильно следовал инструкциям?

Y <- c(356,392,127,127,437,392,392,450,155,181)
YearWeek <- c(201602,201602,201603,201603,201604,201604,201604,201605,201605,201605)
df <- data.frame(YearWeek, Y)
weeks <- as.data.frame(unique(df$YearWeek))


Container_weeks <- c()

for (i in 1:nrow(weeks)) {
  assign(as.character(Container_weeks[i]), 
         sum(df$Y[df$YearWeek==weeks[i,] ], na.rm = FALSE))
}

Для меня это не работает? это только я?

...