Подтвердить что ты не робот

Названия столбцов в совокупности в R

Я знаю, что я могу * re * называть столбцы после агрегирования данных:

blubb <- aggregate(dat$two ~ dat$one, ...)
colnames(blubb) <- c("One", "Two")

В этом нет ничего плохого. Но есть ли способ объединить и назвать столбцы за один раз? Пример:

blubb <- aggregate( ... , cols = c("One", "Two"))

Было бы особенно приятно (и опечатать), чтобы как-то уловить исходные имена столбцов и сделать следующее:

blubb <- aggregate( ... , cols = c(name_of_dat$one, name_of_dat$two."_Mean"))
4b9b3361

Ответ 1

Вы можете использовать setNames как в:

blubb <- setNames(aggregate(dat$two ~ dat$one, ...), c("One", "Two"))

В качестве альтернативы вы можете обойти метод формулы slick и использовать синтаксис, например:

blubb <- aggregate(list(One = dat$one), list(Two = dat$two), ...)

Update

Это обновление поможет вам сразу начать получать решение.

Если вы проверите код для stats:::aggregate.formula, вы увидите следующие строки ближе к концу:

if (is.matrix(mf[[1L]])) {
    lhs <- as.data.frame(mf[[1L]])
    names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
    aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
}
else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)

Если все, что вы хотите сделать, это добавить имя функции к агрегированной переменной, возможно, вы можете изменить ее на следующее:

if (is.matrix(mf[[1L]])) {
  lhs <- as.data.frame(mf[[1L]])
  names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
  myOut <- aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
  colnames(myOut) <- c(names(mf[-1L]), 
                       paste(names(lhs), deparse(substitute(FUN)), sep = "."))
}
else {
  myOut <- aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
  colnames(myOut) <- c(names(mf[-1L]), 
                       paste(strsplit(gsub("cbind\\(|\\)|\\s", "", 
                                           names(mf[1L])), ",")[[1]],
                             deparse(substitute(FUN)), sep = "."))
} 
myOut

Это в основном фиксирует значение, введенное для FUN, используя deparse(substitute(FUN)), поэтому вы можете, вероятно, изменить функцию, чтобы принять пользовательский суффикс или, возможно, даже вектор суффиксов. Возможно, это немного улучшится с некоторой работой, но я не собираюсь это делать!

Вот Gist с использованием этой концепции, создавая функцию с именем myAgg.

Ниже приведено несколько примеров выходных имен столбцов:

> names(myAgg(weight ~ feed, data = chickwts, mean))
[1] "feed"        "weight.mean"
> names(myAgg(breaks ~ wool + tension, data = warpbreaks, sum))
[1] "wool"       "tension"    "breaks.sum"
> names(myAgg(weight ~ feed, data = chickwts, FUN = function(x) mean(x^2)))
[1] "feed"                         "weight.function(x) mean(x^2)"

Обратите внимание, что изменяется только имя агрегированной переменной. Но обратите внимание также, что если вы используете пользовательскую функцию, вы получите действительно странное имя столбца!

Ответ 2

Ответ на ваш первый вопрос: да. Вы можете, конечно, включать имена столбцов в агрегированную функцию. Используя имена из приведенного выше примера:

blubb <- aggregate(dat,list(One=dat$One,Two=dat$Two),sum)

Мне нравится часть о том, что вы, возможно, автоматически вставляете имена исходных столбцов. Если я это выясню, я отправлю его.

Ответ 3

В случае, если вы предпочитаете писать агрегаты как formula документация показывает использование cbind. И cbind позволяет вам назвать его аргументы, которые используются aggregate.

blubb <- aggregate(cbind(Two = dat$two) ~ cbind(One = dat$one), ...)

Агрегирование нескольких столбцов по нескольким группирующим факторам может быть выполнено следующим образом:

blubb <- aggregate(cbind(x = varX, y = varY, varZ) ~ cbind(a = facA) + cbind(b = facB) + facC, data=dat, FUN=sum)

и если вы хотите использовать более одной функции:

aggregate(cbind(cases=ncases, ncontrols) ~ cbind(alc=alcgp) + tobgp, data = esoph, FUN = function(x) c("mean" = mean(x), "median" = median(x)))

#   alc    tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1    1 0-9g/day  1.5000000    1.0000000      43.500000        47.000000
#2    2 0-9g/day  5.6666667    4.0000000      29.833333        34.500000
#...

который добавляет к colname используемую агрегатную функцию.

Но cbind заменяет factors их внутренними кодами. Чтобы избежать этого, вы можете использовать:

with(esoph, aggregate(data.frame(cases=ncases, ncontrols), data.frame(alc=alcgp, tobgp), FUN = function(x) c("mean" = mean(x), "median" = median(x))))

#         alc    tobgp cases.mean cases.median ncontrols.mean ncontrols.median
#1  0-39g/day 0-9g/day  1.5000000    1.0000000      43.500000        47.000000
#2      40-79 0-9g/day  5.6666667    4.0000000      29.833333        34.500000
#...

Ответ 4

w <- data.frame(Funding<-"Fully Insured",Region="North East",claim_count=rnbinom(1000, 300.503572818, mu= 0.5739467))
x <- data.frame(Funding<-"Fully Insured",Region="South East",claim_count=rnbinom(1000, 1000, mu= 0.70000000))
y <- data.frame(Funding<-"Self Insured",Region="North East",claim_count=rnbinom(1000, 400, mu= 0.80000000))
z <- data.frame(Funding<-"Self Insured",Region="South East",claim_count=rnbinom(1000, 700, mu= 1.70000000))
names(w)<-c("Funding","Region","claim_count")
names(x)<-c("Funding","Region","claim_count")
names(y)<-c("Funding","Region","claim_count")
names(z)<-c("Funding","Region","claim_count")
my_df <- rbind(w,x,y,z)
my_df2<-with(my_df, aggregate(x=claim_count, by=list(Funding,Region), FUN=sum))
colnames(my_df2)<-colnames(my_df)