为什么tapply将子集作为NA并且不完全排除它们

时间:2012-07-24 14:02:30

标签: r subset tapply

我有一个问题。我想制作一个带有均值和误差条的条形图,它根据两个因素进行分组。为了得到均值和标准误差,我使用了函数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))

发生了一些奇怪的事情,它没有计算FS,但是它把它放在NA表中:

    row.names   no          yes
1   F           7.009022    5.307185

2   FS          NA          NA

3   S           2.837139    2.111054

这是我不想要的,因为如果我在barplot2(包gplots)中使用它,那么我将获得FS的空栏,而那个不应该在那里。

所以任何使用都有一个解决方案或其他方法来获得一个漂亮的条形图:)。不管怎么说,还是要谢谢你!

1 个答案:

答案 0 :(得分:2)

如果没有您的数据样本,我只会猜测:

您的色谱柱工厂是一个因素。虽然您已删除具有该值的行,但“级别”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 
>