计算大于X的多列上R的平均值
我有以下数据,并希望计算每个cid的t1-t5平均值,按iid分组计算大于X的多列上R的平均值,r,dplyr,R,Dplyr,我有以下数据,并希望计算每个cid的t1-t5平均值,按iid分组 我只想计算大于0的值的平均值 理想情况下,我不希望在执行平均值时命名所有字段,例如平均值(t1)、平均值(t2)。这是因为在我的真实案例中,我有200多个字段 样本数据: cid iid t1 t2 t3 t4 t5 4503 2 4 5 5 6 7 4503 2 7 5 3 2 8 841 2 9 2 1 5 7 2134 1
cid iid t1 t2 t3 t4 t5
4503 2 4 5 5 6 7
4503 2 7 5 3 2 8
841 2 9 2 1 5 7
2134 1 6 9 8 2 1
这是到目前为止我的代码。谁能帮我把它做完吗。提前谢谢
library(dplyr)
test <- read.csv("~/Documents/R-SCRIPTS/DATA/test.csv", sep=";")
t <- test %>%
group_by(cid, iid) %>%
select(t1:t5) %>%
summarise(t1 = mean(t1, na.rm = TRUE),
t2 = mean(t2,na.rm = TRUE),
t3 = mean(t3,na.rm = TRUE),
t4 = mean(t4,na.rm = TRUE),
t5 = mean(t5,na.rm = TRUE)
)
库(dplyr)
测试%
选择(t1:t5)%>%
总结(t1=平均值(t1,na.rm=真值),
t2=平均值(t2,na.rm=真值),
t3=平均值(t3,na.rm=真值),
t4=平均值(t4,na.rm=真值),
t5=平均值(t5,na.rm=真值)
)
这就是你想要的吗?我不使用其他软件包,而是使用colMeans()
。
以下是一个例子:
数据看起来像(示例的简短副本)
守则:
id_list <- unique(mydata$iid) # get the id
result <- matrix(nrow=0, ncol=4) # create a matrix to store result
colnames(result) <- colnames(mydata) # name the columns of the matrix
for (i in 1:length(id_list)){
uid <- id_list[i]
# for each id, calculate the column averages
average <- unname(colMeans(mydata[mydata$iid==uid,2:4]))
# write to the result
result <- rbind(result, c(uid, average))
}
result
对于您的问题,您需要将colMeans(mydata[mydata$iid==uid,2:4])
更改为colMeans(mydata[mydata$iid==uid,2:201])
,这是您想要平均值的列索引。并在矩阵中更改ncol
(nrow=0,ncol=4)
以对应所需的结果数据
对于<0的值,您可以首先将负值转换为NA,
mydata[,2:4][mydata[,2:4]如果我理解正确,您可以使用:
test %>%
group_by(cid, iid) %>%
summarise_each(funs(mean(.[.>0], na.rm = TRUE)), t1:t5)
#Source: local data frame [3 x 7]
#Groups: cid [?]
#
# cid iid t1 t2 t3 t4 t5
# (int) (int) (dbl) (dbl) (dbl) (dbl) (dbl)
#1 841 2 9.0 2 1 5 7.0
#2 2134 1 6.0 9 8 2 1.0
#3 4503 2 5.5 5 4 4 7.5
这是非常优雅的,可以完成工作。谢谢!如果我只想为每个cid的iid计数大于5的情况创建平均值,我将如何增强这一点?我想我会添加%>%筛选器(n()>5)是的,该筛选器应该在摘要之前
> result
iid t1 t2 t3
[1,] 2 6.666667 4 3
[2,] 1 6.000000 9 8
> mydata
iid t1 t2 t3
1 2 4 5 5
2 2 -2 5 3
3 2 9 2 1
4 1 6 9 -1
mydata[,2:4][mydata[,2:4]<0]<-NA
id_list <- unique(mydata$iid)
result <- matrix(nrow=0, ncol=4)
colnames(result) <- colnames(mydata)
for (i in 1:length(id_list)){
uid <- id_list[i]
average <- unname(colMeans(mydata[mydata$iid==uid,2:4], na.rm=TRUE))
result <- rbind(result, c(uid, average))
}
result
> result
iid t1 t2 t3
[1,] 2 6.5 4 3
[2,] 1 6.0 9 NaN
test %>%
group_by(cid, iid) %>%
summarise_each(funs(mean(.[.>0], na.rm = TRUE)), t1:t5)
#Source: local data frame [3 x 7]
#Groups: cid [?]
#
# cid iid t1 t2 t3 t4 t5
# (int) (int) (dbl) (dbl) (dbl) (dbl) (dbl)
#1 841 2 9.0 2 1 5 7.0
#2 2134 1 6.0 9 8 2 1.0
#3 4503 2 5.5 5 4 4 7.5