Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按名称对来自多个行和列的数据进行统计_R_Aggregate - Fatal编程技术网

R 按名称对来自多个行和列的数据进行统计

R 按名称对来自多个行和列的数据进行统计,r,aggregate,R,Aggregate,我有一个大数据帧,12行对应于每个唯一ID。我想按ID计算8列中的值的平均值。换句话说,我想对12x8块中的所有值使用单值平均值(有些块有许多NAs) 下面是一个带有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,

我有一个大数据帧,12行对应于每个唯一ID。我想按ID计算8列中的值的平均值。换句话说,我想对12x8块中的所有值使用单值平均值(有些块有许多NAs)

下面是一个带有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)

ht.1base R
中的一个选项是

 vapply(split(DF[-1], DF$ID), function(x) mean(as.matrix(x), 
             na.rm=TRUE), numeric(1L))
 #   A    B 
 #3.75 3.60 


您只需
unlist
相关值,然后聚合这些值。下面是base 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
或者,您可以使用
堆栈
,然后使用
聚合

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

“数据表”方法特别紧凑和高效:

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

这里有两个摘自哈德利诗篇的片段

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

谢谢,阿克伦,但我想我不清楚我的目标。我想要A和B的所有值的平均值,而不是每列的平均值。我最终想要的是:A 3.75 B 3.6。当然,我希望能够对许多具有比我的简化示例中更大值矩阵的唯一ID执行此操作。@erictall阐明您的目标的最佳方法是作为问题的一部分提供您的预期输出(作为R对象)。对不起,我误解了您的问题。谢谢,Ananda。我很欣赏不同的选择。
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
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