【问题标题】:Filter by subcategory and running function in r按子类别过滤并在 r 中运行函数
【发布时间】:2016-01-15 12:20:07
【问题描述】:

我有这样的数据:

  Ind_name Co_Name Year EPS BPS
1        A       X 2001  10  11
2        A       X 2002  12  12
3        A       X 2003  15  15
4        A       Y 2001  10  18
5        A       Y 2002  16  25
6        A       Y 2003  20  26
7        B       Z 2001  14  36
8        B       Z 2002  16   9
9        B       Z 2003  20  10

同样,在我的数据集中有 50 个行业,每个行业有 15 家公司,每个公司都有 20 年的数据。

我想要以下内容: 1. 过滤特定行业特定年份的所有公司数据。例如。

    Ind_name Co_Name Year EPS BPS
1        A       X 2001  10  11
4        A       Y 2001  10  18

之后,我需要计算 EPS 和 BPS 之间的相关系数和回归(斜率)β。

我想要这样的输出:

Ind_name   Year   Correlation    Beta
 A          2001    .55 #assume   1.2 #assume
 A          2002    .85 #assume   0.2 #assume 
 A          2003    .65 #assume   .65 #assume

您能否建议我如何实现这一目标?

注意:相关性和回归斜率可以计算如下:

cor(EPS,BPS)  #corrleation
summary(lm(mydata$EPS~mydata$BPS))$coefficients[2] #directly give beta

【问题讨论】:

  • 它们有多复杂,dplyr 是不可能的?
  • 然后分享你的complex function
  • @moto 我已经编辑了我的问题。请检查一下。
  • 如果数据没有出现在您想要的结果中,为什么要按公司分组数据
  • 在此处查找lm()dplyr 的组合:stackoverflow.com/questions/26765426/…

标签: r for-loop filter


【解决方案1】:

我们可以使用data.table

library(data.table)
setDT(df1)[,list(Mean = mean(EPS), Variance = var(EPS)) ,
                                     by =  .(Ind_name, Year)]

更新

(只是发布我之前的 cmets)。我们将'data.frame'转换为'data.table'(setDT(df1)),按'Ind_name'、'Year'分组,我们得到'EPS'、'BPS'的cor以及@987654325 @ of lm 基于这些列,然后将“Ind_name”作为“A”值的子集。

setDT(df1)[, list(Cor=cor(EPS, BPS),
     Beta = coef(lm(EPS~BPS))[2]) , by =.(Ind_name, Year)
      ][Ind_name=="A"]
#   Ind_name Year Cor      Beta
#1:        A 2001  NA 0.0000000
#2:        A 2002   1 0.3076923
#3:        A 2003   1 0.4545455

【讨论】:

  • 如果我需要计算 EPS 和 BPS 之间的相关性,回归斜率 $\beta$ 等。
  • 我没有给他们投票。另外,在那之后我编辑了我的问题。
  • 是的,我需要执行考虑多个变量数据的函数(行 lm 函数)。
  • 这只是一个问题。我想通过循环来做。
  • 这很好用。但是为此我必须再学习一个包。谢谢。你总是给出最有效的代码。
【解决方案2】:

试试dplyr 包:

library("dplyr")

df %>% 
    group_by(Ind_name, Year) %>% 
    summarise(Mean=mean(EPS),
              Median=median(EPS),
              Variance=var(EPS))

【讨论】:

  • 谢谢。实际上我想通过循环来做到这一点,因为我需要运行一些我不能在 dplyr 包中汇总的复杂函数。
  • 你确定他们不能吗?
  • @Neeraj,让我试试:D
  • @Neeraj 你必须更具体。
  • @Marta,这不是按要求过滤行。还是我错过了什么?
【解决方案3】:

一种更完整的基于data.table 的方法,通过CJ(c("A", ...), c(2001, ...) 实施过滤以仅选择相关行业和年份:

library(data.table)

mydata <- fread("Ind_name Co_Name Year EPS BPS
                        A       X 2001  10  11
                        A       X 2002  12  12
                        A       X 2003  15  15
                        A       Y 2001  10  18
                        A       Y 2002  16  25
                        A       Y 2003  20  26
                        B       Z 2001  14  36
                        B       Z 2002  16   9
                        B       Z 2003  20  10")

setkey(mydata, Ind_name, Year)

mydata[
  CJ("A", c(2001, 2002, 2003))
  , {
    list(
      Correlation = cor(EPS,BPS)
      , Beta = summary(lm(EPS~BPS))$coefficients[2]
      )
  }
  , keyby = .(Ind_name, Year)
]

结果如下所示:

   Ind_name Year Correlation      Beta
1:        A 2001          NA 0.0000000
2:        A 2002           1 0.3076923
3:        A 2003           1 0.4545455

您可以根据需要扩展“函数”(即 J 参数)的复杂性。

【讨论】:

  • 我有 15 家公司的数据,每家公司都有 20 年的数据。我需要在“CJ”命令中输入每个公司名称和年份吗?
  • 当您按 Ind_name 和 Year 的值进行过滤时,您只提供 2 个向量 - 一个包含 Ind_name,第二个必须包含 Year 的值。如果您想要计算每个年份和行业的相关性和 Beta,那么您可以省略整个 CJ()。
猜你喜欢
  • 2021-12-21
  • 1970-01-01
  • 2021-10-26
  • 1970-01-01
  • 2021-11-15
  • 2015-07-23
  • 2020-11-10
  • 2021-05-18
  • 1970-01-01
相关资源
最近更新 更多