2017-02-27 36 views
0

我有一个类似于以下的数据集,我需要比较每年(2005-2009)的值与(2002-2004)的平均值。R中的计算和替换

Year Firm R  
2002 A  30  
2003 A  11  
2004 A  1  
2005 A  7  
2006 A  15  
2007 A  20  
2008 A  3.5 
2009 A  8  
2002 B  24  
2003 B  30  
2004 B  25  
2005 B  5.2 
2006 B  11.8 
2007 B  78  
2008 B  90  
2009 B  57 

,我需要计算的(2002- 2004年),每家公司的平均和年用新的值(即计算出的平均值)替换值2002 - 2004年的问题。例如,新的数据集应该是这样的:

Year Firm R  
    2002 A  14  
    2003 A  14  
    2004 A  14  
    2005 A  7  
    2006 A  15  
    2007 A  20  
    2008 A  3.5 
    2009 A  8  
    2002 B  26.333  
    2003 B  26.333  
    2004 B  26.333  
    2005 B  5.2 
    2006 B  11.8 
    2007 B  78  
    2008 B  90  
    2009 B  57 

我曾尝试使用下面的代码:

df$R[df$Year==2002 & df$Year==2003 & df$Year==2004] = (df$R[df$Year==2002] + df$R[df$Year==2003] + df$R[df$Year==2004])/3 

但是当我应用它没有什么变化???? !!!!! ? 我希望你能与这个问题

+0

中的错误,你的代码是你没有按照“公司”名称和分组进行分组当我应用您的代码时,我也会使用'&'替代或'|' –

回答

1

您可以使用data.table对于这一点,如果你喜欢:

library(data.table) 

year <- c(rep(seq(2002,2009,1),2)) 
firm <- c(rep("A",8),rep("B",8)) 
r <- c(30,11,1,7,15,20,3.5,8,24,30,25,5.2,11.8,78,90,57) 

aa <- data.table(year,firm,r) 

aa[year>=2002 & year<=2004, r:= mean(r), by = firm] 

给予这样的结果:

year firm  r 
1: 2002 A 14.00000 
2: 2003 A 14.00000 
3: 2004 A 14.00000 
4: 2005 A 7.00000 
5: 2006 A 15.00000 
6: 2007 A 20.00000 
7: 2008 A 3.50000 
8: 2009 A 8.00000 
9: 2002 B 26.33333 
10: 2003 B 26.33333 
11: 2004 B 26.33333 
12: 2005 B 5.20000 
13: 2006 B 11.80000 
14: 2007 B 78.00000 
15: 2008 B 90.00000 
16: 2009 B 57.00000 
+0

我收到以下错误:'[.tbl_df(test2,year> = 2002&year <= 2004,:=(r,mean(r) ),: 未使用的参数(by = firm)' –

+0

您是否安装了数据表包? –

+0

是的,我做到了。当我将您的代码应用于大型数据集时,我收到此错误。变量的类是否影响代码?例如'firm'和'year'被归类为'Factor' –

1

在你的代码中的错误帮助的是,你没有被Firm名称分组并且还使用&代替或|。在我的示例中,test.txt是与输入相同的文件。

下面的代码应该可以帮助你实现你所需要的。

library(dplyr) 
df <- read.delim('test.txt', header = T, sep = '\t') 

print(df) 

# get unique firm names for grouping 
firms <- unique(df$Firm) 

# for each firm, calculate mean and update it  
for (f in firms){ 
    df$R[df$Firm == f & (df$Year==2002 | df$Year==2003 | df$Year==2004)] = 
     sum(df$R[df$Firm == f & (df$Year==2002 | df$Year==2003 | df$Year==2004)])/3 
} 

print(df) 
0

试试这个dplyr版本:

library(tidyverse) 

data %>% 
    filter(Year<2005) %>% # this subsets the data 
    group_by(Firm) %>% # state which values you want to evaluate 
    summarise(m=mean(R)) %>% # take the mean (named mean) 
    left_join(data) %>% # join the original data to the summarised data 
    mutate(R=ifelse(Year<2005 & Firm=='A', m, 
       ifelse(Year<2005 & Firm=='B', m, R))) %>% # nested ifelse to define conditions 
    select(year,firm,R) -> newdata # select the desired columns and rename the data.frame