在r中按子类别和运行函数进行筛选

在r中按子类别和运行函数进行筛选,r,for-loop,filter,R,For Loop,Filter,我有这样的数据: 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

我有这样的数据:

  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
之后,我需要计算相关系数,以及每股收益和每股收益之间的回归(斜率)β

我想要这样的输出:

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
软件包:

library("dplyr")

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

试用
dplyr
软件包:

library("dplyr")

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

我们可以使用
data.table

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

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


我们可以使用
data.table

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

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


更完整的
数据。基于表的方法,通过
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)
]

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

一种更完整的
数据。基于表格的方法,通过
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)
]


您可以扩展“函数”(即J参数)的复杂性尽可能多。

它们有多复杂,不可能使用
dplyr
吗?然后分享你的
复杂函数
@moto我已经编辑了我的问题。请查看。如果你想要的结果中没有数据,为什么要按公司分组数据请在这里查找
lm()
dplyr
组合:它们是如何复杂的,
dplyr
是不可能的?然后分享你的
复杂函数
@moto我已经编辑了我的问题。请查看。如果你想要的结果中没有数据,为什么要按公司分组数据请在这里查找
lm()
结合
dplyr
:谢谢。实际上,我想通过循环来实现这一点,因为我需要运行一些复杂的函数,而我不能在dplyr包的摘要中运行。你确定他们不能吗?@Neeraj,让我试试:D@Neeraj你必须更具体一些。@Marta,这不是按要求筛选行。或者我遗漏了什么欣?谢谢。实际上我想通过循环来完成这项工作,因为我需要运行一些复杂的函数,而我不能在dplyr包的摘要中运行。你确定他们不能吗?@Neeraj,让我试试:D@Neeraj你必须更具体一些。@Marta,这不是按要求筛选行。或者我遗漏了什么?如果我需要计算corr呢EPS和BPS之间的关系,回归斜率$betaβ等。我还没有投票给他们。另外,我在之后编辑了我的问题。是的,我需要执行考虑数据多于一个变量的函数(Line LM函数)。。这只是一个问题。我想通过循环完成。这很有效。但为此,我必须再学习一个程序包。谢谢。您总是提供最有效的代码。如果我需要计算每股收益和每股收益之间的相关性,回归斜率$\beta$等,我没有对它们进行优化。此外,我还编辑了我的问题。是的,我需要执行以下操作:M函数考虑多个变量的数据(行LM函数)。这只是一个问题。我想通过循环完成。这很有效。但为此,我必须再学习一个软件包。谢谢。你总是提供最有效的代码。我有15家公司的数据,每个公司有20年的数据。我需要在“CJ”中键入每个公司的名称和年份吗命令?当您根据Ind_name和Year的值进行过滤时,您只会给出2个向量-一个包含Ind_name,第二个必须包含Year的值。如果您希望计算每个年份和行业的相关性和Beta,则可以省略整个CJ().我有15家公司的数据,每个公司都有20年的数据。我是否需要在“CJ”中键入每个公司的名称和年份命令?当您根据Ind_name和Year的值进行筛选时,您只会给出2个向量-一个包含Ind_name,第二个必须包含Year的值。如果您希望计算每个年份和行业的相关性和Beta,则可以省略整个CJ()。