R 为什么tapply将子集视为NA而不完全排除它们

R 为什么tapply将子集视为NA而不完全排除它们,r,subset,tapply,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 这是我不想要的,因为如果我在barplot2(pa

我有个问题。我想用平均值和误差条做一个条形图,其中它被分成两个因素。为了得到平均值和标准误差,我使用了函数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 
这是我不想要的,因为如果我在barplot2(package gplots)中使用它,那么我将得到一个用于FS的空条,而这个条根本不应该存在


那么,我们是否有解决方案或其他方法来获得一个漂亮的条形图:)。无论如何谢谢你

如果没有您的数据样本,我只能打赌:

你的植物是一个因素。当您删除了具有该值的行时,“级别”
FS
仍然存在。使用
级别(数据$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 
> 
dat级别(dat$y)
[1] “a”“b”“c”
dat水平(dat$y)
[1] “a”“b”“c”
> 
>tapply(dat$x,dat$y,总和)
a、b、c
NA 40 45
> 
>液滴液位(dat$y)
[1] b c b c b c b c b c c
级别:b级和c级
>dat$y tapply(dat$x,dat$y,总和)
b c
40 45 
> 

您能给我们一段您的数据吗?您可以为此使用
dput
。如果没有这一点,我就打赌:您的列
plant
是一个因素,虽然您删除了具有该值的行,但
级别的FS
仍然存在。使用
级别(数据$plant)
查看。然后你可以使用
droplevels
来删除它。@Justin:我建议将其作为答案发布。我打算回答dat$y如果答案对你有效,请单击左上角的复选框将其标记为已回答。这样别人就知道你的问题得到了回答。
    row.names   no          yes
1   F           7.009022    5.307185

2   FS          NA          NA

3   S           2.837139    2.111054
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 
>