2015-10-30 45 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]