Установить имя переменной, определенной в формуле - PullRequest
0 голосов
/ 25 октября 2018

Это только что пришло мне в голову,

Давайте возьмем этот пример из недавнего вопроса:

data:

df1<-
structure(list(Year = c(2015L, 2015L, 2015L, 2015L, 2016L, 2016L, 
2016L, 2016L), Category = c("a", "1", "2", "3", "1", "2", "3", 
"1"), Value = c(2L, 3L, 2L, 1L, 7L, 2L, 1L, 1L)), row.names = c(NA, 
-8L), class = "data.frame")

code:

aggregate( Value ~ Year + c(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]), data=df1, FUN=sum )

токовый выход: (посмотрите длинное уродливое имя нового var)

#  Year c(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) Value
#1 2015                                                   OneTwo     3
#2 2016                                                   OneTwo     1
#3 2015                                                    three     5
#4 2016                                                    three    10

желаемый вывод:

#  Year MY_NAME Value
#1 2015  OneTwo     3
#2 2016  OneTwo     1
#3 2015   three     5
#4 2016   three    10

обратите внимание:

  • Можно (возможно, следует) объявить новую переменную.
  • Этот вопрос о том, как НАПРАВИТЬ имя новой переменной ПРЯМО, добавив к ней кодлайнер в секции code:.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

1) aggregate.data.frame Используйте aggregate.data.frame, а не aggregate.formula:

by <- with(df1, 
  list(
    Year = Year, 
    MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]
  )
)
aggregate(df1["Value"], by, FUN = sum)

, что дает:

  Year MY_NAME Value
1 2015  OneTwo     3
2 2016  OneTwo     1
3 2015   three     5
4 2016   three    10

2) 2 шага Возможно, будет немного чище разделить это на две части (1) создать новый фрейм данных, в который преобразуется Категория, и (2) выполнить агрегирование.

df2 <- transform(df1, MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1])
aggregate(Value ~ Year + MY_NAME, df2, sum)

2a) или выражение (2) в терминах магистрального трубопровода:

library(magrittr)

df1 %>%
  transform(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) %>%
  aggregate(Value ~ Year + MY_NAME, ., sum)
0 голосов
/ 25 октября 2018

Вместо c нам нужно cbind, что приводит к matrix одного столбца с именем столбца 'MY_NAME', в то время как c получает named vector с уникальными именами (make.unique) 'MY_NAME'

aggregate( Value ~ Year +
   cbind(MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]), data=df1, FUN=sum )
#  Year MY_NAME Value
#1 2015  OneTwo     3
#2 2016  OneTwo     1
#3 2015   three     5
#4 2016   three    10

В ?aggregate упоминается об использовании cbind в методе formula

формула - формула, например, y ~ x или cbind (y1, y2) ~ x1 + x2, где переменные y представляют собой числовые данные, которые нужно разбить на группы в соответствии с переменными группировки x (обычно факторами).


Опция с tidyverse будет

library(dplyr)
df1 %>% 
      group_by(Year, MY_NAME = c("OneTwo", "three")[Category %in% 1:2 + 1]) %>%
      summarise(Value = sum(Value))
...