【问题标题】:apply function in vectorization of a vector inside another vector在另一个向量内的向量的向量化中应用函数
【发布时间】:2014-03-28 21:31:51
【问题描述】:

年份
1999 1999 1999 2003 2003 2005 2005 2005 2005 2007 2009 2009 2009

A1
15 7 24 6 65 5 89 56 21 15 19 7 23

上表显示了一个数据框。我想要一个向量,可以说“median1”,其中 a1 中这些值的中位数对应于每年。而且我知道使用 for 循环很容易,但我正在尝试找到一个基于“矢量化”的解决方案。

【问题讨论】:

标签: r


【解决方案1】:

使用ave,这是一个 R 基本函数。将avetransform 结合起来,你会得到一个相当不错的输出。考虑dat 是你的data.frame

> transform(dat, Median= ave(a1, year, FUN=median))
  year a1 Median
1 1999 20   15.0
2 1999 15   15.0
3 1999 11   15.0
4 2003 11    7.0
5 2003  3    7.0
6 2007 89   40.5
7 2007 25   40.5
8 2007 56   40.5
9 2007 12   40.5

如果您只想要一个由每年的中位数组成的向量,您可以这样做:

> with(dat, ave(a1, year, FUN=median))
[1] 15.0 15.0 15.0  7.0  7.0 40.5 40.5 40.5 40.5

【讨论】:

    【解决方案2】:

    如果您的data.frame 被称为DF,则使用data.table

    library(data.table)
    DT = data.table(DF)
    DT[,median(a1),by='year']
    

    【讨论】:

      【解决方案3】:

      在基础 R 中,您可以这样做:

      foo <- data.frame(
        year=c(1999,1999,1999,2003,2003,2005,2005,2005,2005,2007,2009,2009,2009),
        A1=c(15,7,24,6,65,5,89,56,21,15,19,7,23))
      by(foo$A1,foo$year,median)
      

      严格来说,结果不会是vector,但您可以修复它:

      as.vector(by(foo$A1,foo$year,median))
      

      by() 在您想要 组进行操作时总是很有帮助。

      【讨论】:

        【解决方案4】:

        我不清楚,但您似乎想要每年的中位数?如果是这样……

        ## set up the data
        > year <- c(1999,1999,1999,2003,2003,2005,2005,2005,2005,2007,2009,2009,2009)
        > A1 <- c(15, 7, 24, 6, 65, 5, 89, 56, 21, 15, 19, 7, 23)
        > dd <- data.frame(year, A1)
        
        ## solution
        > xx <- c(do.call(cbind, lapply(split(dd, dd$year), function(x) median(x$A1))))
        > names(xx) <- unique(dd$year)
        > xx
        1999 2003 2005 2007 2009 
        15.0 35.5 38.5 15.0 19.0 
        

        【讨论】:

        • 谢谢大家。这很有帮助。
        猜你喜欢
        • 2021-12-28
        • 2016-08-18
        • 1970-01-01
        • 2017-07-22
        • 1970-01-01
        • 2018-03-30
        • 1970-01-01
        • 2015-07-07
        相关资源
        最近更新 更多