tapply 中的多个 ID 列表
Multiple IDs list in tapply
我想计算一个变量在不同组中的均值。要定义组,我想利用数据框中描述单个观察值的两列的组合:
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
我想您可能正在寻找这些解决方案之一。 tapply()
第一个参数是一个向量,而不是整个数据集。来自 help(tapply)
Usage
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
Arguments
X
an atomic object, typically a vector.
我发现如果我们以 with()
开始调用,tapply()
更容易理解。在这里我们可以在 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()
。另请注意,我们可以获得更多信息的结果是我们在 tapply()
中使用 data.frame()
而不是 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
另一个选项:
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
我想计算一个变量在不同组中的均值。要定义组,我想利用数据框中描述单个观察值的两列的组合:
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
我想您可能正在寻找这些解决方案之一。 tapply()
第一个参数是一个向量,而不是整个数据集。来自 help(tapply)
Usage
tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)
Arguments
X
an atomic object, typically a vector.
我发现如果我们以 with()
开始调用,tapply()
更容易理解。在这里我们可以在 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()
。另请注意,我们可以获得更多信息的结果是我们在 tapply()
中使用 data.frame()
而不是 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
另一个选项:
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