2016-04-22 101 views
0

多個索引我有一個數據幀,就像這一個:tapply基於R中

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的最大數目,每年。 我已經創建了一個函數,計算出連續NAs的最大數量,但只能基於一個變量。

例如,

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 

所以有最大的總參考文獻A 200個連續NAS和最多90在參考文獻B中,這是正確的是。也有120次來港在2014年,90在2015年

我想是每個ref和一年的結果,如:

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

回答

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 

通過使用熔化(),您可以獲得相同的數據幀。

+0

這正是我想要的。謝謝! – sym246

0

我喜歡的食譜格式

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 
1

非常類似於上面的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