2017-03-18 73 views
2

我是一個偶然的R-用戶與幾家大型數據集的年度工作與今年一列,另一個用於位置處理多餘的行,類似於以下(我稱之爲「時間序列」):在colMeans計算

Year L1  
1960 1.11 
1961 1.14 
1962 0.75 
1963 0.63 
1964 1.15 
1965 1.08 
1966 1.69 
1967 0.77  
1968 0.69 

我試圖通過4組計算colMeans,但排在我的數據集的數量並不總是由4理想整除,我會被列入計算之前的任何額外行組。

所以在上面的例子中有9行,R會計算1960-1963(一組4個),1964-1968(一組5個)的平均值。

這可能嗎?

我對4組當前的代碼如下:

fouryrave <- rep(colMeans(matrix(timeseries$L1, nrow=4), na.rm=TRUE)) 
+0

您使用colMeans,因爲它可以更容易地創建一個分組變量,然後使用聚合 – user20650

回答

3

做的最好的事情是創建分組變量和骨料,即

n = 4 
l1 <- nrow(df) %/% n 
df$grp <- c(rep(seq(l1), each = n), rep(tail(seq(l1), 1), nrow(df) - n * l1)) 

aggregate(L1 ~ grp, df, mean) 
# grp  L1 
#1 1 0.9075 
#2 2 1.0760 

DATA

dput(df) 
structure(list(Year = 1960:1968, L1 = c(1.11, 1.14, 0.75, 0.63, 
1.15, 1.08, 1.69, 0.77, 0.69)), .Names = c("Year", "L1"), row.names = c(NA, 
-9L), class = "data.frame") 

編輯

基於您的評論(我有一些時間來殺死),這裏是接受type參數指定分組方法的功能,

f1 <- function(df, n, type = 1){ 
    if(type == 1){ 
    l1 <- nrow(df) %/% n 
    df$grp <- c(rep(seq(l1), each = n), rep(tail(seq(l1), 1), nrow(df) - n * l1)) 
    return(aggregate(L1 ~ grp, df, mean)) 
    } else { 
    if(type == 2){ 
    l1 <- nrow(df) %/% n 
    df$grp <- c(rep(seq(l1), each = n), rep(tail(l1, 1)+1, nrow(df) - n * l1)) 
    return(aggregate(L1 ~ grp, df, mean)) 
    } 
    } 

} 

f1(df, 4, type = 1) 
# grp  L1 
#1 1 0.9075 
#2 2 1.0760 

f1(df, 4, type = 2) 
# grp  L1 
#1 1 0.9075 
#2 2 1.1725 
#3 3 0.6900 
+0

謝謝,做我需要的東西。 – Bek

+0

一個(可能是愚蠢的)question--可同樣的事情,如果我想要額外的行(S)爲自己的小組使用? – Bek

+0

我不能確定我明白你的問題。以上只是分配一個值每n行,如果有多餘的行它asaigns它們相同的值作爲最後 – Sotos

1

您可以從其他的分別計算的最後一組的平均值是這樣的:

fouryrave <- colMeans(matrix(timeseries$L1[1:((length(timeseries$L1) %/% 4 
        -1)*4)],nrow=4),na.rm=TRUE) 

fouryrave[length(fouryrave)+1] <- 
      mean(timeseries$L1[(((length(timeseries$L1)%/%4-1)*4)+1):length(timeseries$L1)]) 
+0

謝謝,我實際上將需要這一個,也當我想計算最後一組的意圖分開。 – Bek