R 基于另一个向量中的ID对列进行行求和
我有两个输入数据框,第一个称为“Firms_Ind”,包含两列(“Firms”、“Industry”)和多行。它给出了每个公司的行业ID。另一个称为“ann_returns”,它的列数与“Firms_Ind”的行数和多行数相同。它包含每个公司(列)每年(行)的回报 我想计算每个行业的年平均回报率。所以我想要一个输出矩阵,它的维数是:列数=年数,行数=年数。对于每个行业(列),应计算每年的平均回报 下面是一个小例子:R 基于另一个向量中的ID对列进行行求和,r,dataframe,aggregate,R,Dataframe,Aggregate,我有两个输入数据框,第一个称为“Firms_Ind”,包含两列(“Firms”、“Industry”)和多行。它给出了每个公司的行业ID。另一个称为“ann_returns”,它的列数与“Firms_Ind”的行数和多行数相同。它包含每个公司(列)每年(行)的回报 我想计算每个行业的年平均回报率。所以我想要一个输出矩阵,它的维数是:列数=年数,行数=年数。对于每个行业(列),应计算每年的平均回报 下面是一个小例子: > Firms_Ind Firms Industry 1 A
> Firms_Ind
Firms Industry
1 A 1
2 B 2
3 C 3
4 D 1
5 E 2
6 F 1
> ann_returns
A B C D E F
y1 0.20 0.11 0.13 0.30 0.24 0.03
y2 0.23 0.08 0.03 0.23 0.17 0.01
y3 0.28 0.19 0.11 0.21 0.19 0.07
> Industry_mean
1 2 3
y1_means 0.20 0.11 0.13
y2_means 0.23 0.08 0.03
y3_means 0.28 0.19 0.11
下面是一个使用
sapply
# get a list of firms by industry
inds <- split(Firms_Ind$Firms, Firms_Ind$Industry)
# loop through industries to calculate annual means
myMat <- sapply(inds,
function(i) if(length(i) > 1) rowMeans(ann_returns[, i]) else ann_returns[, i])
数据
Firms_Ind <-
structure(list(Firms = structure(1:6, .Label = c("A", "B", "C",
"D", "E", "F"), class = "factor"), Industry = c(1L, 2L, 3L, 1L,
2L, 1L)), .Names = c("Firms", "Industry"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))
ann_returns <-
structure(c(0.2, 0.23, 0.28, 0.11, 0.08, 0.19, 0.13, 0.03, 0.11,
0.3, 0.23, 0.21, 0.24, 0.17, 0.19, 0.03, 0.01, 0.07), .Dim = c(3L,
6L), .Dimnames = list(c("y1", "y2", "y3"), c("A", "B", "C", "D",
"E", "F")))
Ind公司使用dplyr
和tidyr
library(tidyr)
library(dplyr)
Industry_mean <- ann_returns %>%
gather(key=Firms,value=value,-Year) %>% #convert to long format
left_join(Firms_Ind) %>% #merge with firms_ind
group_by(Year,Industry) %>% #group as required
summarise(mean=mean(value)) %>% #calculate means
spread(key=Industry,value=mean) #convert back to wide format
Industry_mean
Year `1` `2` `3`
* <chr> <dbl> <dbl> <dbl>
1 y1 0.1766667 0.175 0.13
2 y2 0.1566667 0.125 0.03
3 y3 0.1866667 0.190 0.11
library(tidyr)
图书馆(dplyr)
行业平均值%
聚集(键=公司,值=值,-年)%>%#转换为长格式
左加入(企业界)%>%\35;与企业界合并
按(年度、行业)分组%>%\u按要求分组
总结(平均值=平均值(值))%>%#计算平均值
价差(键=行业,值=平均值)#转换回宽格式
工业是什么意思
年份'1``2``3`
*
1日元0.1766667 0.175 0.13
2 y2 0.156667 0.125 0.03
3 y3 0.1866667 0.190 0.11
我们可以按列拆分ann\u返回的
,然后运行rowMeans
:
# if Firms in correct order
inds <- split.default(ann_returns, f = Firms_Ind$Industry)
# # if Firms not in correct order:
# inds <- split.default(
# ann_returns,
# f = Firms_Ind$Industry[match(colnames(ann_returns), Firms_Ind$Firms)])
do.call(cbind, lapply(inds,rowMeans))
# 1 2 3
# y1 0.1766667 0.175 0.13
# y2 0.1566667 0.125 0.03
# y3 0.1866667 0.190 0.11
您是否尝试过将ann\u returns
重新格式化为长格式,然后将公司Ind
合并到其中,然后按行业分组计算平均值?谢谢!这似乎是我正在寻找的解决方案。但是,如果我使用实际数据帧运行它,会出现以下错误:[.data.frame
(ROE\u ac,I)中的错误:未定义的列选择了我的数据帧:ann\u返回的是ROE\u ac(R=305,C=2),Firms\u Ind是Firms\u FF(R=30,C=305)谢谢!如果公司的顺序正确,你的确切意思是什么?@Tobi1990,我的意思是ann\u returns
的列名称是否与firms\u Ind
的列名称顺序相同,这样你就可以直接拆分,而不必先匹配公司名称。是的。再次感谢,你的解决方案非常有效!你能告诉我怎么做吗我可以创建一个新的数据框架,其中包含该行业中每个公司的计算行业平均值。因此,类似于ann_的回报,但对于同一行业的公司,其值相等:因此,对于第一年,例如a、D和F将为0.1766667。您可以尝试res
# if Firms in correct order
inds <- split.default(ann_returns, f = Firms_Ind$Industry)
# # if Firms not in correct order:
# inds <- split.default(
# ann_returns,
# f = Firms_Ind$Industry[match(colnames(ann_returns), Firms_Ind$Firms)])
do.call(cbind, lapply(inds,rowMeans))
# 1 2 3
# y1 0.1766667 0.175 0.13
# y2 0.1566667 0.125 0.03
# y3 0.1866667 0.190 0.11
# > dput(ann_returns)
structure(list(A = c(0.2, 0.23, 0.28), B = c(0.11, 0.08, 0.19
), C = c(0.13, 0.03, 0.11), D = c(0.3, 0.23, 0.21), E = c(0.24,
0.17, 0.19), F = c(0.03, 0.01, 0.07)), .Names = c("A", "B", "C",
"D", "E", "F"), row.names = c("y1", "y2", "y3"), class = "data.frame")
# > dput(Firms_Ind)
structure(list(Firms = structure(1:6, .Label = c("A", "B", "C",
"D", "E", "F"), class = "factor"), Industry = c(1L, 2L, 3L, 1L,
2L, 1L)), .Names = c("Firms", "Industry"), class = "data.frame", row.names = c("1",
"2", "3", "4", "5", "6"))