Среднее по фактору по уровню

Возможно, это просто, но я не могу найти ответ в Интернете. У меня проблема с расчетом среднего по факторам по уровням. Мои данные выглядят типично:

factor, value
a,1
a,2
b,1
b,1
b,1
c,1

Я хочу, чтобы вектор A содержал среднее значение только для уровня "a". Если я набираю A на консоли, я хочу получить 1.5. И этот метод вычисления среднего должен использовать коэффициенты.

Заранее благодарю за помощь.


person Bartek Taciak    schedule 30.04.2014    source источник
comment
Попробуйте aggregate(value~factor, FUN=mean)   -  person Thomas    schedule 30.04.2014
comment
@Bartek. Если вы собираетесь выполнить работу по обходу фрейма данных, чтобы определить, какие элементы являются факторами == a, вы также можете выполнить операцию для всего фрейма данных и воспользоваться другими средствами позже, если это необходимо.   -  person JPC    schedule 30.04.2014


Ответы (4)


Просто для удовольствия опубликовать решение data.table, хотя вам, вероятно, следует сделать то, что предлагает @lukeA

library(data.table) 
A <- setDT(df)[factor == "a", mean(value)]
## [1] 1.5
person David Arenburg    schedule 30.04.2014
comment
Какой поистине причудливый язык программирования R. - person duhaime; 06.11.2018
comment
@duhaime Это очень глупый способ сделать что-то очень простое. Я опубликовал это, когда только присоединился к нам, и мне очень хотелось получить репутацию. Если бы я мог, я бы удалил это все вместе. Кстати, решения в комментариях вам тоже кажутся странными? Можете ли вы найти что-нибудь менее причудливое, чем aggregate(value~factor, FUN=mean) в Python (не говоря уже о том, что Pandas скопировал все из R). - person David Arenburg; 06.11.2018
comment
аминь. В Python нет ничего более милого, чем агрегатная функция (которая довольно разборчива), но в целом я считаю Python более выразительным и легким для чтения. Я считаю, что R обычно полон чрезвычайно кратких операторов, которые, хотя и более компактны, чем синтаксис Python, их труднее прочитать со страницы (по крайней мере, для тех, кто не приверженцем). Читая функцию на Python, сразу понимаешь, как ее перевести на любое количество языков, но не для R. Тем не менее, может быть, мне просто нужно выпить koolaid ... - person duhaime; 06.11.2018
comment
@duhaime вы слышали о пакете dplyr (или tidyverse) в R? Я считаю, что нет ничего более выразительного, чем это, в любом языке. Что касается Python, там так много запутанных вещей, таких как все эти ярлыки для понимания списка, у numpy есть трюк np.reshape(-1,.... Можно в итераторе загнать горпубы и тд. Но думаю, эта дискуссия ни к чему не приведет :) - person David Arenburg; 06.11.2018

взгляните на tapply, который позволяет вам разбить вектор в соответствии с фактором (факторами) и применить функцию к каждому подмножеству

> dat<-data.frame(factor=sample(c("a","b","c"), 10, T), value=rnorm(10))
> r1<-with(dat, tapply(value, factor, mean))
> r1
         a          b          c
 0.3877001 -0.4079463 -1.0837449
> r1[["a"]]
[1] 0.3877001

Вы можете получить доступ к своим результатам, используя r1[["a"]] и т. Д.

В качестве альтернативы можно использовать один из популярных пакетов R (plyr).

> library(plyr)
> r2<-ddply(dat, .(factor), summarize, mean=mean(value))
> r2
  factor       mean
1      a  0.3877001
2      b -0.4079463
3      c -1.0837449
> subset(r2,factor=="a",select="mean")
       mean
1 0.3877001

Вместо этого вы также можете использовать dlply (который принимает фрейм данных и вместо этого возвращает список)

> dlply(dat, .(factor), summarize, mean=mean(value))$a
       mean
1 0.3877001
person JPC    schedule 30.04.2014
comment
Можно ли использовать ddply с двумя факторами? - person Ben; 15.01.2020
comment
@Ben действительно, вы можете просто изменить вызов ddply на ddply(dat, .(factor, factor2), summarize, mean=mean(value)), и это будет распространено на большее количество столбцов, по которым вы хотите сгруппировать. надеюсь, это поможет - person JPC; 15.01.2020

Следующий код запрашивает среднее значение, когда factor = a:

mean(data$value[data$factor == "a"])
person Lenatis    schedule 30.04.2014
comment
идеально! Я именно это и искал! в том, как выбрать определенный фактор - person Darwin PC; 26.06.2019

Еще одна простая возможность - это функция "by":

by(value, factor, mean)

Среднее значение фактора «а» можно получить следующим образом:

factor_means <- by(value, factor, mean)
factor_means[attr(factor_means, "dimnames")$factor=="a"]
person Ruediger Ziege    schedule 13.03.2017
comment
как мне использовать уровни фактора вместо самого фактора? - person Ben; 10.01.2020