【问题标题】:apply function for each subgroup为每个子组应用函数
【发布时间】:2016-01-13 00:01:00
【问题描述】:

我想知道如何使用循环函数来计算

apply(table(data$people,data$event),2,function(x) mean(x[x>0])) 

对于每个级别的颜色。我的意思是,我想为每个颜色级别计算上述函数。

people <-c("R1","R2","R2","R3","R3","R4","R4","R4","R4","R3","R3","R3","R3","R2","R2","R2","R5","R6")
event<-c("a","b","b","M","s","f","y","b","a","a","a","a","s","c","c","b","m","a")
Colour<-c("red","blue","green","pink","red","blue","grean","red","red","black","pink","blue","blue","green","blue","green","green","red")

data<-data.frame(people,event,Colour)

【问题讨论】:

  • 请不要留下algorithm标签,因为这个问题与算法设计无关。
  • 你想要的输出是什么?目前还不是很清楚你想做什么。
  • 让我试着把话放在你的嘴里,你告诉我我是否正确:对于每个Colour,你想计算每个eventpeople的数量并总结这是所有参加活动中people的平均数量(仅包括在平均值中的非零出席人数)。是这样吗?
  • @David Arenburg,例如当 Colour="red" 计算上述函数时。而不是使用子集,我想使用循环函数。
  • R 中的最佳实践是尽可能避免循环,因为它们 [在 R 中] 非常慢。相反,您需要对代码进行矢量化。 *apply 系列函数允许类似的功能,dplyr 也是如此,通常更具可读性。

标签: r


【解决方案1】:

要对每个组执行函数,让我们首先将其设为函数:

your_function = function(data) {
    apply(table(data$people,data$event),2,function(x) mean(x[x>0]))
}

然后我们可以按颜色拆分您的数据并将您的函数应用于每个子数据帧:

dat_split = split(data, f = data$Colour)
results = lapply(dat_split, your_function)

results
# $black
#   a   b   c   f   m   M   s   y 
#   1 NaN NaN NaN NaN NaN NaN NaN 
#
# $blue
#   a   b   c   f   m   M   s   y 
#   1   1   1   1 NaN NaN   1 NaN 
#
# $grean
#   a   b   c   f   m   M   s   y 
# NaN NaN NaN NaN NaN NaN NaN   1 
# ...

就我个人而言,我觉得这不是很友好。 data.tabledplyr 使对数据帧子集的处理变得容易。我会从一开始就使用dplyr,就像这样:

library(dplyr)
data %>% group_by(people, Colour, event) %>%
    summarize(n = n()) %>%
    group_by(Colour, event) %>%
    summarize(mean = mean(n)) %>%
    tidyr::spread(key = event, value = mean)

# Source: local data frame [6 x 9]
#
#   Colour     a     b     c     f     m     M     s     y
#   (fctr) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) (dbl)
# 1  black     1    NA    NA    NA    NA    NA    NA    NA
# 2   blue     1     1     1     1    NA    NA     1    NA
# 3  grean    NA    NA    NA    NA    NA    NA    NA     1
# ...

【讨论】:

  • 如果你在第一个版本的results 中使用sapply 而不是lapply,你会得到一个更好看的表格。
  • @Gregor,还有一个问题,当我在我的数据集上应用你的第一个解决方案时它可以工作,但是对于第二个我得到这个错误:错误:所有列都必须命名关于这个有什么想法吗?
  • 以前没见过这个错误。您的所有列都有名称吗?
猜你喜欢
  • 2015-05-16
  • 2012-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多