Почему tapply принимает подмножество как NA, а не исключает их полностью?

У меня есть вопрос. Я хочу сделать гистограмму со средним значением и погрешностями, где она сгруппирована по двум факторам. Чтобы получить среднее значение и стандартные ошибки, я использовал функцию tapply.

Однако для одного из факторов я хочу опуститься на один уровень.

Итак, что я сделал, то сделал:

dataFE <- data[-which(plant=="FS"),] # this works fine, I get exactly the data set I want without the FS level of the factor plant 

Затем, чтобы получить среднее значение и стандартную ошибку, я использую это:

means <- with(dataFE, as.matrix(tapply(leaves, list(plant, Orchestia), mean), nrow=2)

e <- with(dataFE, as.matrix(tapply (leaves, list(plant, Orchestia), function(x) sd(x)/sqrt(length(x))), nrow=2))

И там происходит что-то странное, он не считает ФС, однако ставит его в таблицу с NA:

    row.names   no          yes
1   F           7.009022    5.307185

2   FS          NA          NA

3   S           2.837139    2.111054

Этого я не хочу, потому что, если я использую это в barplot2 (пакет gplots), я получу пустую полосу для FS, тогда как ее вообще не должно быть.

Так что у любого использования есть решение или другой метод, чтобы получить хороший барплот :). Спасибо, в любом случае!


person Marinka    schedule 24.07.2012    source источник
comment
Можете ли вы дать нам фрагмент ваших данных? Вы можете использовать dput для этого. Без этого я просто сделаю предположение: ваш столбец plant является фактором, и хотя вы удалили строки с этим значением, "level" FS все еще существует. Используйте levels(data$plant), чтобы увидеть. Затем вы можете использовать droplevels, чтобы избавиться от него.   -  person Justin    schedule 24.07.2012
comment
@Justin: я бы рекомендовал опубликовать это как ответ.   -  person David Robinson    schedule 24.07.2012


Ответы (1)


Без образца ваших данных я просто сделаю предположение:

ваш столбчатый завод является фактором. И хотя вы удалили строки с этим значением, «уровень» FS все еще существует. Используйте levels(data$plant), чтобы увидеть. Затем вы можете использовать droplevels, чтобы избавиться от него.

dat <- data.frame(x=1:15, y=factor(letters[1:3]))

> levels(dat$y)
[1] "a" "b" "c"

dat <- dat[dat$y != 'a',]
> levels(dat$y)
[1] "a" "b" "c"
> 

> tapply(dat$x, dat$y, sum)
 a  b  c 
NA 40 45 
> 

> droplevels(dat$y)
 [1] b c b c b c b c b c
Levels: b c
> dat$y <- droplevels(dat$y)

> tapply(dat$x, dat$y, sum)
 b  c 
40 45 
> 
person Justin    schedule 24.07.2012
comment
Я собирался ответить dat$y ‹- factor(dat$y) и когда я посмотрел на код droplevels.factor, я обнаружил, что это именно то, что он делает. - person IRTFM; 25.07.2012
comment
Если ответ вам подходит, отметьте его как ответ, установив флажок в левом верхнем углу. Таким образом, другие узнают, что на ваш вопрос дан ответ. - person Justin; 25.07.2012