2015-10-30 43 views
0

我寫了一些數據到CSV-這應該是一個可共享的鏈接。如果它說沒有訪問權限,那麼只是在一般情況下,不勝感激。 https://drive.google.com/a/rice.edu/file/d/0B-O6tTyIMPyaNUNtQlJGVkNRcGs/view?usp=sharing創建for循環來計算某一年的總和

我有超過220,000條目的數據集。我試圖做的,沒有寫50多行代碼是:

有一個類別叫fyear,從1980年到2014年不等。對於每一年,我想把「收入」這一欄的總和寫成「那一年,然後除以當年的參賽人數。

沒有一個循環,這將是─例如1980年

n80<- subset(returns, fyear=="1980") 
sum(n80$returns)/length(n80) 

,它會回到我want-的價值,但我並不想通過做這44倍。所以,我需要做一些我假設的循環。我所能想到的是

returns=NULL 
for (i in 1:fyear) { 
year.returns[i]= sum(returns$return)/ length(?) 

如何參考每個會計年度的條目數量的長度?

讀到apply/sapply等現在看看我是否可以弄清楚如何做到這一點。

回答

1

由於fyear是一個數值,它很容易在範圍迭代:

for(i in 1980:2014){ 
    x<- subset(returns, fyear==i) 
    sum(x$returns)/length(x) 
} 

在你原來的代碼你的報價有1980年,表明它是一個字符,如果這是你可以使用的情況下fyear == as.character(i)

您也可以使用向量化方案sapply

1

我能想到的一個簡單方法是使用unique。使用years <- unique(returns$fyear)可以獲得包含所有年份的矢量。然後,您可以遍歷years向量中的值,並執行問題中提到的計算。

它會照顧任何失蹤的一年。

2

您可以dplyr

library(dplyr) 

data %>% 
    group_by(fyear) %>% 
    summarize(mean_returns = mean(returns)) 
1

我們可以data.table做到這一點做到這一點。將'data.frame'轉換爲'data.table'(setDT(data)),按'fyear'分組,我們得到'returns'的mean

library(data.table) 
setDT(data)[, list(mean_returns = mean(returns)) , by = fyear]