【问题标题】:Why does tapply take the subset as NA and not exclude them totally为什么 tapply 将子集作为 NA 而不是完全排除它们
【发布时间】:2012-07-24 14:02:30
【问题描述】:

我有一个问题。我想用平均值和误差线制作一个条形图,其中它被分组为两个因素。为了获得平均值和标准误差,我使用了函数 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 的空栏,而那个根本不应该在那里。

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

【问题讨论】:

  • 你能给我们你的数据的sn-p吗?您可以为此使用dput。没有那个,我只是猜测一下:您的列 plant 是一个因素,虽然您删除了具有该值的行,但 "level" FS 仍然存在。使用levels(data$plant)查看。然后你可以使用droplevels 来摆脱它。
  • @Justin:我建议将其发布为答案。

标签: r subset tapply


【解决方案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 
> 

【讨论】:

  • 我正准备回答 dat$y
  • 如果答案适合您,请单击左上角的复选框将其标记为已回答。这样其他人就知道您的问题已得到解答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-10
  • 1970-01-01
相关资源
最近更新 更多