【问题标题】:select subset of different data.frame columns选择不同data.frame列的子集
【发布时间】:2013-04-19 16:46:18
【问题描述】:

我想从每一列中选择一个不同的数据框子集,然后像这样进行平均

per <- data.frame(Apocal=c(10,1,2,3,4,0,6),Aporos=c(0,2,1,3,0,5,6),Euker=c(0,3,5,7,0,0,0), fecha=c(1,1,2,2,2,3,3))

temp <-with(per, per[Apocal>0,])
require(plyr)
temp <- ddply(temp, .(fecha), summarise, Apocal = mean(Apocal))

temp <-with(per, per[Aporos>0,])
temp <- ddply(temp, .(fecha), summarise, Aporos = mean(Aporos))

...

对每一列都重复一遍,除了 fecha,有没有办法用函数或其他东西来自动化?

谢谢!

【问题讨论】:

    标签: r dataframe plyr


    【解决方案1】:

    aggregate:

    aggregate(. ~ fecha, data = per, function(x)mean(x[x > 0]))
    #   fecha Apocal Aporos Euker
    # 1     1    5.5    2.0     3
    # 2     2    3.0    2.0     6
    # 3     3    6.0    5.5   NaN
    

    【讨论】:

      【解决方案2】:
      pmean <- function(x,byvar){
        y=x[,-1*byvar]
        colSums(y*(y>0))/colSums(y>0)
      }
      
      ddply(per, .(fecha), function(x) pmean(x,4))
      

      Arun 解决方案的修改版本。

      【讨论】:

      • colSums(y)/colSums(y&gt;0) 就足够了,不是吗?添加y = 0条目不会影响分子的总和。
      • @Arun 如果某些 y 为负数怎么办?说y=c(-1,0,1)
      • 我不知道为什么,但我认为&gt; 不是预期的运算符,而是!=。如果可能有负值,这是来自 OP 的一个坏例子,你的答案更好地涵盖了它!我很快就会删除我的帖子。
      【解决方案3】:

      如果你的函数是mean,你可以正常使用函数colMeans。它计算所有列的平均值(按列表示)。但是由于您需要在删除每列的 0 个条目后计算平均值,因此您可以使用colSums,如下所示:

      # x gets all columns grouped by `fecha`.
      ddply(per, .(fecha), function(x) colSums(x[, -4])/colSums(x[, -4] != 0))
      #   fecha Apocal Aporos Euker
      # 1     1    5.5    2.0     3
      # 2     2    3.0    2.0     6
      # 3     3    6.0    5.5   NaN
      

      【讨论】:

      • 您忘记了 OP 在采取手段之前要过滤掉 0
      • @flodel,是的,我怀疑我做错了什么。感谢您指出。已编辑。
      猜你喜欢
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多