2016-02-19 26 views
0

考慮一個名爲listDF的數據框列表。每個dataframes具有相同的欄目:跨列表中的數據框執行基本計算(總數的百分比)的最佳方式是什麼?

"Date" "Location" "V1" "V2"其中V1是充滿了實數

我想計算總的百分比列說V1每個日期/位置組合。對於每個特定的日期/地點對,所有數據幀的和爲V1,然後計算每個V1觀測值對相關樣本的份額。

我已經試過:

我堆棧dataframes,因爲我不知道該怎麼做掃地,而無需通過數據幀/日期/位置組合,這顯然是低效的循環。

library(plyr)

aggregate <- rbind.fill(listDF)

ptt <- ddply(aggregate,.(Date,Location),transform, share= V1/sum(V1))

最後一行導致RStudio崩潰,並要求我開始一個新的會話。 FWIW,平均數據幀有50k行,列表總共有大約1M行。我應該使用prop.table嗎?

在一個理想的世界中,我會在每個數據框中將百分比總數(ptt)作爲列,而不是單獨堆疊的數據幀,而這些數據幀之後我將不得不拆分。

*旁邊的問題:有沒有辦法選擇哪個列表元素的子集用於任何給定的ptt?我假定在我最初的問題中使用所有數據框,但願意根據V2的標準選擇。

感謝您的幫助。

+2

讓你的問題重現的 – mtoto

+2

「,而不是在一個堆疊的數據框中,我將不得不拆分。「你爲什麼要分裂它? R中的幾乎所有問題都可以通過堆棧數據輕鬆解決。順便說一句,dplyr已經在hadleyverse(即Hadley的包裹的宇宙)中取代了plyr。 – Frank

+0

@Frank感謝您的評論,我將使用dplyr。我想維護數據框列表中的分割結構,主要是因爲當我嘗試上述方法時,會話會崩潰。起初我以爲這是一個內存問題(因爲它堆積爲1M +行),但我不認爲這是問題。最後,我希望能夠將每個數據幀導出到不同的文件中,但要注意不會妨礙在單個數據幀中進行實際分析。 – user4547611

回答

1

如果列表中的每個數據幀具有相同的列,那麼使用具有指示原始數據幀的額外變量的單個數據幀將更容易。然後,您可以輕鬆執行按數據框分組的計算。

樣本數據

# two data frames 
d1 <- data.frame(x = rep(LETTERS[1:2], each = 5), y = rnorm(10)) 
d2 <- data.frame(x = rep(LETTERS[1:2], each = 7), y = rnorm(14)) 

# put data frames in a list 
L <- list(d1, d2) 

我們可以使用dplyr::bind_rows()爲 「不公開」 L成單個數據幀。該.id選項指示bind_rows創建一個明確的變量識別原始數據幀:

library(dplyr) 
d <- bind_rows(L, .id = "dat") 

現在你可以做你所創建的變量分組任何摘要:

d %>% 
    group_by(dat) %>% 
    summarise(mean_y = mean(y)) 
+0

謝謝@DMC。我需要哪個版本的dplyr?安裝後我無法識別bind_rows。您還可以詳細說明我將如何在您提供的解決方案中完成百分比? – user4547611

+0

你加載了包:'library(dplyr)'?如果你加載了這個包並且'bind_rows()'不可見,那麼安裝一個新版本的'dplyr'。 – davechilders

+0

我做了@DMC。我使用稍舊的RStudio和Eclipse版本。當我安裝'dplyr'時,我發現它是0.2版,而我在網上看到0.4版。這是能夠使用'bind_rows'的差異嗎?如果是這樣,我該如何下載最新版本?我已經關閉了會議並嘗試重新安裝該軟件包。 – user4547611

相關問題