2015-09-13 4 views
0

Я хочу рассчитать среднее значение переменной в разных группах. Для того, чтобы определить группы я хочу использовать комбинацию два столбца в кадре данных, которые описывают отдельные наблюдения:Список нескольких идентификаторов в ответ на запрос

a<-sample(12) 
b<-sample(-100:100, 12) 
d<-c(-11:0) 
O<-rep(c("Nn","Hy"), each=6) 
H<-rep(c("In+", "In-"), each=3, times=2) 
ID<-rep(c("bo","co", "do", "fo"), each=3) 
mydata<-data.frame(ID, a, b, d, O, H) 
gg.df <- melt(mydata, id.var=c("ID", "O", "H"), variable.name="int") 

mean.w<-tapply(subset(x= gg.df, subset = int == "a") , 
list(gg.df$O, gg.df$H), mean, na.rm=TRUE) 

я получаю сообщение об ошибке:

Error in tapply(subset(x = gg.df, subset = int == "a"), list(gg.df$O, : 
    arguments must have same length 
+2

Возможно, вы ищете для 'aggregate (значение ~ O + H, подмножество (gg.df, int ==" a "), среднее)'? –

ответ

3

Я думаю, что, возможно, вы ищете либо одно из этих решений. С tapply() первым аргументом является вектор, а не весь набор данных. От help(tapply)

Использование

tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

Аргументы

X атомного объекта, как правило, вектор.

Я обнаружил, что tapply() легче понять, если начать вызов с with(). Здесь мы можем использовать подмножество в вызове with(), тогда вызов tapply() намного легче читать.

with(subset(gg.df, int == "a"), tapply(value, list(O, H), mean, na.rm = TRUE)) 
#   In-  In+ 
# Hy 5.000000 8.000000 
# Nn 5.333333 7.666667 

aggregate(value ~ O + H, subset(gg.df, int == "a"), mean, na.rm = TRUE) 
# O H value 
# 1 Hy In- 5.000000 
# 2 Nn In- 5.333333 
# 3 Hy In+ 8.000000 
# 4 Nn In+ 7.666667 

Обратите внимание, что вы можете также использовать gg.df[gg.df$int == "a", ] для подмножества в месте использования subset(). Также обратите внимание, что мы можем получить немного более информативный результат, что мы используем data.frame() в tapply() вместо list()

with(subset(gg.df, int == "a"), tapply(value, data.frame(O, H), mean)) 
#  H 
# O   In-  In+ 
# Hy 5.000000 8.000000 
# Nn 5.333333 7.666667 
+0

Возможно ли получить «а» внутри ответвления? Я попробовал 'gg.df [int ==" a ",]', но этот подход работает только для 'id.var' – Al14

+2

Ну, я полагаю, вы могли бы сделать' tapply (gg.df [gg.df $ int == "a "," value "], gg.df [gg.df $ int ==" a ", c (" O "," H ")], означает)', но тогда вы будете подмножеством для 'a' дважды, что может быть менее эффективным. Это также является хорошей иллюстрацией того, почему мы используем 'with()' there –

1

Другой вариант:

library(dplyr) 
library(tidyr) 

mydata %>% 
    gather(int, value, -O, -H, -ID) %>% 
    filter(int == "a") %>% 
    group_by(O, H) %>% 
    summarise(value = mean(value, na.rm = TRUE)) 

Что дает:

#  O  H value 
# (fctr) (fctr) (dbl) 
#1  Hy In- 7.333333 
#2  Hy In+ 6.666667 
#3  Nn In- 6.666667 
#4  Nn In+ 5.333333