[英]R stats on data from multiple rows and columns by name
我有一个大的数据框,其中有12行对应于每个唯一ID。 我想通过ID从8列计算值的平均值。 换句话说,我要对12x8块中的所有值使用单一值均值(某些值具有多个NA)
这是带有3x4块的简单版本:
ht.1<-c(3,2,4,4,5,4)
ht.2<-c(3,7,3,4,1,2)
ht.3<-c(5,4,3,6,3,NA)
ht.4<-c(6,2,3,3,NA,4)
DF<-data.frame(ID=c("A","A","A","B","B","B"),ht.1=ht.1,ht.2=ht.2,ht.3=ht.3,ht.4=ht.4)
我正在寻找与“ A”和“ B”对应的所有值的均值
汇总功能?
希望有道理-我是这个网站和R的新手。
您可以只unlist
相关值,然后汇总这些值。 这是基于R的方法:
by(DF[-1], DF[1], FUN = function(x) mean(unlist(x), na.rm = TRUE))
# ID: A
# [1] 3.75
# ------------------------------------------------------------------
# ID: B
# [1] 3.6
另外,您可以使用stack
然后aggregate
:
aggregate(values ~ ID, cbind(DF[1], stack(DF[-1])),
function(x) mean(x, na.rm = TRUE))
# ID values
# 1 A 3.75
# 2 B 3.60
“ data.table”方法特别紧凑且高效:
library(data.table)
as.data.table(DF)[, mean(unlist(.SD), na.rm = TRUE), by = ID]
# ID V1
# 1: A 3.75
# 2: B 3.60
这是Hadleyverse的两幅作品。
library(reshape2)
dcast(melt(DF, id.vars = "ID"), ID ~ "mean.ht", value.var = "value",
fun.aggregate = function(x) mean(x, na.rm = TRUE))
# ID mean.ht
# 1 A 3.75
# 2 B 3.60
library(tidyr)
library(dplyr)
DF %>%
gather(var, val, ht.1:ht.4) %>%
group_by(ID) %>%
summarise(val = mean(val, na.rm = TRUE))
# Source: local data frame [2 x 2]
#
# ID val
# 1 A 3.75
# 2 B 3.60
base R
一个选项是
vapply(split(DF[-1], DF$ID), function(x) mean(as.matrix(x),
na.rm=TRUE), numeric(1L))
# A B
#3.75 3.60
要么
tapply(as.matrix(DF[-1]), DF$ID[row(DF[-1])], FUN=mean, na.rm=TRUE)
# A B
#3.75 3.60
要么
library(dplyr)
DF %>%
group_by(ID) %>%
do(data.frame(val=mean(unlist(.[-1]), na.rm=TRUE)))
# ID val
#1 A 3.75
#2 B 3.60
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.