首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的子范畴过滤和运行函数

R中的子范畴过滤和运行函数
EN

Stack Overflow用户
提问于 2016-01-15 12:20:07
回答 3查看 246关注 0票数 1

我有这样的数据:

代码语言:javascript
复制
  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.过滤特定行业特定年份的所有公司的数据。例如:

代码语言:javascript
复制
    Ind_name Co_Name Year EPS BPS
1        A       X 2001  10  11
4        A       Y 2001  10  18

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

我想要这样的产出:

代码语言:javascript
复制
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

你能建议我如何做到这一点吗?

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

代码语言:javascript
复制
cor(EPS,BPS)  #corrleation
summary(lm(mydata$EPS~mydata$BPS))$coefficients[2] #directly give beta
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-15 12:55:28

我们可以使用data.table

代码语言:javascript
复制
library(data.table)
setDT(df1)[,list(Mean = mean(EPS), Variance = var(EPS)) ,
                                     by =  .(Ind_name, Year)]

更新

(只是张贴我之前的评论)。我们将“data.frame”转换为“data.table”(setDT(df1)),按“Ind_name”、“年份”分组,根据这些列得到'EPS‘、'BPS’以及coef of lmcor,然后将'Ind_name‘作为"A“值的子集。

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-01-15 12:25:18

尝试使用dplyr包:

代码语言:javascript
复制
library("dplyr")

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

Stack Overflow用户

发布于 2016-01-15 13:46:25

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

代码语言:javascript
复制
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)
]

结果如下:

代码语言:javascript
复制
   Ind_name Year Correlation      Beta
1:        A 2001          NA 0.0000000
2:        A 2002           1 0.3076923
3:        A 2003           1 0.4545455

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34810972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档