如何利用r中的循环函数得到简洁的代码

如何利用r中的循环函数得到简洁的代码,r,loops,R,Loops,整个数据包括5列,分别命名为A、B、C、D和Portfolio。我将为每个投资组合运行线性回归模型。因此,将整个数据划分为子集数据。然后,运行回归模型并检查其摘要。 数据框如下表所示 A B C D Portfolio 1 ... 11 2 ... 22 3 ... 13 4 ...

整个数据包括5列,分别命名为A、B、C、D和Portfolio。我将为每个投资组合运行线性回归模型。因此,将整个数据划分为子集数据。然后,运行回归模型并检查其摘要。 数据框如下表所示

      A    B    C    D    Portfolio
1           ...               11
2           ...               22
3           ...               13
4           ...               11
5           ...               21
6           ...               21
7           ...               23
8           ...               12
9           ...               11
10          ...               12 
11          ...               22
...                       
我所做的代码如下所示

Portfolio_11<-subset(df, Portfolio==11)
Portfolio_12<-subset(df, Portfolio==12)
Portfolio_13<-subset(df, Portfolio==13)
Portfolio_21<-subset(df, Portfolio==21)
Portfolio_22<-subset(df, Portfolio==22)
Portfolio_23<-subset(df, Portfolio==23)

Reg_11<-lm(A ~ B + C + D, data=Portfolio_11)
Reg_12<-lm(A ~ B + C + D, data=Portfolio_12)
Reg_13<-lm(A ~ B + C + D, data=Portfolio_13)
Reg_21<-lm(A ~ B + C + D, data=Portfolio_21)
Reg_22<-lm(A ~ B + C + D, data=Portfolio_22)
Reg_23<-lm(A ~ B + C + D, data=Portfolio_23)

summary(Reg_11)
summary(Reg_12)
summary(Reg_13)
summary(Reg_21)
summary(Reg_22)
summary(Reg_23)

Portfolio_11我们可以使用group by函数中的一个

library(data.table)
dtSummary <- setDT(df)[,  list(list(summary(lm(A ~ B + C + D)))), by = Portfolio]
dtSummary$V1
库(data.table)

dtSummary使用base R,您可以尝试:

#creates your combinations
subs <- apply(expand.grid(1:3, 1:2), 1, function(x) as.numeric(paste0(x, collapse="")))
# loop along these combinations. Note the print.
for (i in subs)
   print(summary(lm(A ~ B + C + D, data=subset(df, Portfolio==i))))
#创建您的组合

subs为了让自己的生活更轻松,可以使用其中一个R包进行数据挖掘。Akrun已经提到data.table;这也是dplyr的
do
的经典用例:

library(dplyr)
df %>%
    group_by(Portfolio) %>%
    do(smry=summary(lm(A ~ B + C + D, data=.)))

这是split-apply组合方法的一个经典案例,或者至少是split-apply部分,因为不清楚要对输出执行什么操作。在base R中有一种方法可以做到这一点,即在名为
摘要的列表中返回结果:

Summaries <- lapply(split(df, df$Portfolio), function(i) summary(lm(A ~ B + C + D, data = i)))

总结你能把它变成一个?
library(dplyr)
df %>%
    group_by(Portfolio) %>%
    do(smry=summary(lm(A ~ B + C + D, data=.)))
Summaries <- lapply(split(df, df$Portfolio), function(i) summary(lm(A ~ B + C + D, data = i)))