【问题标题】:Calculation and replacement in RR中的计算和替换
【发布时间】:2017-02-27 10:03:54
【问题描述】:

我有一个如下所示的数据集,我需要将每年 (2005-2009) 的值与 (2002-2004) 的平均值进行比较。

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

但是当我应用它时,什么都没有改变!!!!!!?????? 希望你能帮忙解决这个问题

【问题讨论】:

  • 您的代码中的错误是您没有按Firm 名称分组,而是使用&|

标签: r


【解决方案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

【讨论】:

  • 当我应用您的代码时,我收到以下错误:Error in [.tbl_df (test2, year &gt;= 2002 &amp; year &lt;= 2004, :=(r, mean(r)), : unused argument (by = firm)
  • 数据表包你安装了吗?
  • 是的,我做到了。当我将您的代码应用于大型数据集时,我收到此错误。变量的类会影响代码吗?例如firmyear被归类为Factor
  • 因为错误提示:unused argument (by = firm) 让我认为您的数据集是 data.frame 而不是 data.table。只是为了确定使用test &lt;- data.table(your data) 将您的数据分配给一个变量。如果公司是一个因素,这无关紧要,但我会把年份数字化。
  • 问题解决了。谢谢您的帮助。代码工作正常,但我应该先将年份更改为数字。
【解决方案2】:

您的代码中的错误是您没有按Firm 名称分组,而是使用&amp;|。在我的示例中,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)

【讨论】:

    【解决方案3】:

    试试这个 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
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 2018-02-01
      • 1970-01-01
      • 2016-07-19
      • 2016-12-04
      • 2020-08-05
      • 2019-08-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多