2017-07-19 73 views
1

我有一個數據幀(以下形式的樣品):計算統計數據和/或R中的數據幀的子集上的多個列的函數

DateTime    Ind1 Ind2 V1 V2 Ac1 Ac2 w1 w2 w3 shift 
2016-05-01 00:01:00  U  A 5 7 20 100 50 70 200 1 
2016-05-01 00:01:20  U  A 5 7 20 109 35 77 140 1 
2016-05-01 00:01:40  U  A 5 7 40 120 55 97 160 1 
... 
2016-05-01 00:08:20  U  A 5 7 15 157 70 70 204 2 
... 
2016-05-02 00:08:20  U  A 5 7 28 147 65 90 240 2 
... 
2016-05-02 00:20:00  U  A 5 7 35 210 45 100 167 3 

我需要一個新的數據幀,其中一些數據(例如意味着,標準差)列V1至W3列出每個日期和移位合成,類似於下面的內容:

Date  shift Ind1 Ind2 avgV1 sdV1 avgV2 sdV2 avgAC1 .... 
2016-05-01 1  U  A 5.3 2.9 7.8 4.5 108 ..... 
2016-05-01 2  U  A 6.7 3.5 8.9 5.0 99 ..... 

解決方案嘗試:
我可以做下面的步驟。

1)從日期時間

df$Date <- format(as.POSIXct(df$DateTime, format="%Y-%m-%d %H:%M:%S"), format="%Y-%m-%d") 

2)提取日期的日期和換檔標記數據。

df$DateShift <- paste(df$Date, df$shift) 

3)對於每個子集,計算在一個山坳的一些統計數據:

tmp_df <- data.frame(levels(as.factor(df$DateShift))) 
avgV1 <- tapply(df$V1, df$DateShift, FUN=mean) 
sdV1 <- tapply(df$V1, df$DateShift, FUN=sd) 
avgV2<- tapply(df$V2, df$DateShift, FUN=mean) 
.... 

不過,我有50分多列在原來的數據幀,與不同類型的名稱(而不是簡單在上面的例子中)。
此外,我想要計算的統計數據可能會有所不同(比如,計算最大值和最小值,或其他用戶定義的函數)。

所以我不想手工編寫列的不同組合和統計類型(平均值,標準dev等)
這是什麼方法來實現這個自動化?

回答

1

我確定dplyr解決方案即將推出,但doBy包對於這類事情非常適用,除非您有很多(百萬+)行,在這種情況下它會很慢。

library(doBy) 
df_avg <- summaryBy(. ~ Date + Shift, FUN=c(mean, median, sd), data=df, na.rm=TRUE) 

會給出一個數據幀與V1.meanV1.median,等等。 . ~表示「彙總所有數字變量」。例如,如果要在數據框中保留某些因素的信息,請使用參數id.vars = ~somefac+somefac2

+0

感謝您的回覆Remko。如何忽略不應計算統計數據的列(上面的Ind1和Ind2)? – Sree

+0

我認爲你可以使用'id.vars'參數,然後刪除它們,或者保持原樣並在完成時拋棄它們。 ''dfr < - dfr [,!grepl(「Ind1 | Ind2」,names(dfr))]''(必須這樣去除'Ind1.mean','Ind1.median'等) –

0
library(dplyr) 

df %>% 
    mutate(Date = as.Date(DateTime)) %>% 
    group_by(Date, shift) %>% 
    summarise_each(funs(mean)) 
相關問題