【问题标题】:tapply based on multiple indexes in Rtapply 基于 R 中的多个索引
【发布时间】:2016-04-22 13:58:12
【问题描述】:

我有一个数据框,很像这个:

ref=rep(c("A","B"),each=240)
year=rep(rep(2014:2015,each=120),2)
month=rep(rep(1:12,each=10),4)
values=c(rep(NA,200),rnorm(100,2,1),rep(NA,50),rnorm(40,4,2),rep(NA,90))

DF=data.frame(ref,year,month,values)

我想计算每个参考文献每年连续 NA 的最大数量。 我创建了一个函数,它可以计算出连续 NA 的最大数量,但只能基于一个变量。

例如,

func <-   function(x) { 
  max(rle(is.na(x))$lengths) 
} 

with(DF, tapply(values,ref, func))
# A   B 
# 200  90 

with(DF, tapply(values,year, func))
# 2014 2015 
# 120   90

所以在 ref A 中总共最多有 200 个连续的 NA,在 ref B 中最多有 90 个,这是正确的。 2014 年也有 120 个 NA,2015 年有 90 个。

我想要的是每个参考和年份的结果,例如:

A 2015 80
A 2014 120
B 2015 90
B 2014 50

【问题讨论】:

    标签: r apply with-statement tapply


    【解决方案1】:

    有多种方法可以做到这一点,一种是使用 plyr 库:

    library(plyr)
    ddply(DF,c('ref','year'),summarise,NAs=max(rle(is.na(values))$lengths))
    
      ref year NAs
    1   A 2014 120
    2   A 2015  80
    3   B 2014  60
    4   B 2015  90
    

    使用你的函数,你也可以尝试:

    with(DF, tapply(values,list(ref,year), func))
    

    输出略有不同

      2014 2015
    A  120   80
    B   60   90
    

    通过使用 melt(),您可以访问相同的数据帧。

    【讨论】:

    • 这正是我想要的。谢谢!
    【解决方案2】:

    与上面的 tapply 解决方案非常相似。我发现aggregate 的输出比tapply 好。

    with(DF, aggregate(list(Value = values),list(Year = year,ref = ref), func))
    
      Year  ref  Value
    1 2014   A   120
    2 2015   A    80
    3 2014   B    60
    4 2015   B    90
    

    【讨论】:

      【解决方案3】:

      我喜欢食谱格式

      library(dplyr)
      
      DF$values[is.na(DF$values)] <- 1   
      
      DF %>% 
       filter(values==1) %>%  
       group_by(ref,year) %>% 
       mutate(csum=cumsum(values)) %>% 
       group_by(ref,year) %>% 
       summarise(max(csum))
      
      Source: local data frame [4 x 3]
      Groups: ref [?]
      
           ref  year max(csum)
         (fctr) (int)     (dbl)
      1      A  2014       120
      2      A  2015        80
      3      B  2014        50
      4      B  2015        90
      

      【讨论】:

        猜你喜欢
        • 2011-07-10
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多