2017-04-02 30 views
1

我正在清理/組織數據的最後階段,並希望爲此步驟提供建議。我是R新手,並不完全理解數據框或其他數據類型是如何工作的。 (我試圖學習,但有一個項目,所以需要一個快速的解決方案)。我已經從CSV文件導入數據。如何將r中的相同實例組合爲一個並同時生成頻率和平均值?

我想分組具有相同(日期,ID1,ID2,ID3)的實例。我想要輸出中所有統計數據的平均值,以及分組數量的新列。

注:ID3包含。我想這些重命名爲 「NA」 分組 之前,我已經試過解決方案

tdata$ID3[is.na(tdata$ID3)] <- "NA" 
tdata[["ID3"]][is.na(tdata[["ID3"]])] <- "NA" 

但得到錯誤:

In `[<-.factor`(`*tmp*`, is.na(tdata[["ID3"]]), value = c(3L, 3L, : 
    invalid factor level, NA generated 

的數據是:

 date  ID1  ID2  ID3 stat1 stat2 stat.3 
1 12-03-07 abc123 wxy456 pqr123 10 20  30 
2 12-03-07 abc123 wxy456 pqr123 20 40  60 
3 10-04-07 bcd456 wxy456 hgf356 10 20  40 
4 12-03-07 abc123 wxy456 pqr123 30 60  90 
5 5-09-07 spa234 int345 <NA>  40 50  70 

所需的輸出

date  ID1,  ID2, ID3, n, stat1, stat2, stat 3 
12-03-07 abc123, wxy456, pqr457, 3, 20, 40, 60 
10-04-07 bcd456, wxy456, hgf356, 1, 10, 20, 40 
05-09-07 spa234, int345, big234, 1 , 40, 50, 70 

我試過這個解決方案:How to merge multiple data.frames and sum and average columns at the same time in R

但我沒有成功合併列進行分組和測試的相似性。

DF <- merge(tdata$date, tdata$ID1, tdata$ID2, tdata$ID3, by = "Name", all = T) 



Error in fix.by(by.x, x) : 'by' must specify uniquely valid columns 

最後,要生成n列。也許插入1行並在總結時使用列的總和?

+0

請檢查您的第一行所需的輸出。預期的平均值不同 – akrun

+0

我的壞,是的,它應該是12-03-07 abc123,wxy456,pqr457,3,20,40,60 6 – MyLeftS0ck

回答

3

我們可以用dplyr來做到這一點。由「ID」列分組後,加入「日期」和「n」也是在分組變量,並獲得「統計」欄目

library(dplyr) 
df1 %>% 
    group_by(ID1, ID2, ID3) %>% 
    group_by(date = first(date), n =n(), add=TRUE) %>% 
    summarise_at(vars(matches("stat")), mean) 

注意的mean:關於變更「NA」到「big234 ID3」,我們可以將'以character類,做以上操作

df1$ID3 <- as.character(df1$ID3) 
df1$ID3[is.na(df1$ID3)] <- "big234" 
+0

工作就像一個魅力!我很欣賞你的優雅解決方案沒想到這將是一個單一的聲明! – MyLeftS0ck

+0

@ MyLeftS0ck感謝您的評論。你也可以勾選[here](http://stackoverflow.com/help/someone-answers) – akrun

1

之前改變它雖然我找到akrun非常直觀的使用提出了dplyr的解決方案,也有一個很好的data.table解決方案:

同樣作爲krun,我假設NA值已被轉換爲「big234」以獲得期望的結果。

library(data.table) 
# convert data.frame to data.table 
data <- data.table(df1) 

# return the desired output 
data[, c(.N, lapply(.SD, mean)), 
    by = list(date, ID1,ID2, ID3)] 
相關問題