【问题标题】:Loop same actions in R在 R 中循环相同的动作
【发布时间】:2021-02-02 20:28:41
【问题描述】:

这里有问题。

我想在 R 中循环我的操作,但是不知道如何正确有效地进行此操作。

我有几个不同大小的数据集,每次执行相同的代码块非常耗时。

这是我需要应用于每个数据集并将模型的数据或输出写入具有不同名称的数据集的代码。

##########################################################################################################################

#the combined list of separate data frames where the last letter is changing A, B, C...
z <- list(Data_A, Data_B, Data_C)


#need to loop these operations performed by using data from datasets. Here is an example by using data from Data_A dataset. 


# TFP estimation by using ACF method
ACF_A <-  prodest::prodestACF(Data_A$turn, fX = Data_A$cogs, sX = Data_A$tfa, pX = Data_A$cogs, idvar = Data_A$ID, timevar = Data_A$Year, 
                                 R = 100, cX = NULL, opt = 'DEoptim', theta0 = NULL, cluster = NULL)  

omegaACF_A <- prodest::omega(ACF_A)

Data_A$omegaACF_A <- prodest::omega(ACF_A) 

#########################################################################################################################

# Growth variables
Data_A <- Data_A %>% 
  arrange(ID, Year) %>% 
  group_by(ID) %>% 
  mutate(domegaACF_A = omegaACF_A - dplyr::lag(omegaACF_A),
         debt = LOAN + LTD,
         ddebt = debt - dplyr::lag(debt),
         dsales = SALE - dplyr::lag(SALE)) %>% 
  ungroup

# Panel data frame
PData_A <- pdata.frame(Data_A, index = c("ID","Year"))

# Within estimator
within_2way_A <- plm(domegaACF_A ~ dplyr::lag(domegaACF_A, 1) + dplyr::lag(domegaACF_A, 2) + ddebt + lag(ff1, 1) + ddebt:lag(ff1, 1) + log(Age) + ta + dsales, 
             data = PData_A, effect = "twoways", model ="within", index = c("ID", "Year")) 

主要问题是我不知道如何将数据存储在具有相应名称的单独数据集中。例如,在以下代码块中,根据使用的数据集,_A 应更改为 _B_C。 p>

ACF_A <-  prodest::prodestACF(Data_A$turn, fX = Data_A$cogs, sX = Data_A$tfa, pX = Data_A$cogs, idvar = Data_A$ID, timevar = Data_A$Year, 
                                 R = 100, cX = NULL, opt = 'DEoptim', theta0 = NULL, cluster = NULL)  

omegaACF_A <- prodest::omega(ACF_A)

Data_A$omegaACF_A <- prodest::omega(ACF_A) 

我知道有 lapplyfor 循环,但我不知道如何使用它们来更改存储变量的名称:

z <- list (df1, df2, df3)

for (i in z){

ACF_[1 or 2 or 3] <-  prodest::prodestACF(i$turn, fX = i$cogs, sX = i$tfa, pX = i$cogs, idvar = i$ID, timevar = i$Year, 
                                 R = 100, cX = NULL, opt = 'DEoptim', theta0 = NULL, cluster = NULL)  

omegaACF_[1 or 2 or 3] <- prodest::omega(ACF_[1 or 2 or 3])

Data_[]$omegaACF_[1 or 2 or 3] <- prodest::omega(ACF_[1 or 2 or 3])

{

UPD:这里有几个数据集:https://drive.google.com/drive/folders/1gBV2ZkywW6JqDjRICafCwtYhh2DHWaUq?usp=sharing

UPD2:

Data_A
turn cogs tfa SALE 
 1     1   1    1    
 2     2   2    2    
 3     3   3    3   
 4     4   4    4    

Data_B
turn cogs tfa SALE 
 5     5   5    5   
 6     6   6    6   
 7     7   7    7  
 8     8   8    8   

运行循环后我需要:

  1. ACF_AACF_B等存储变量,prodest函数的估计结果将存储在其中
  2. omegaACF_AomegaACF_B 等将存储来自 prodest 的 omega 变量的存储空间
  3. omegaACF_AomegaACF_B的估计结果应作为新变量相应地添加到Data_A、Data_B数据集中。
  4. 之后,在 Data_A、Data_B 数据集中,应创建增长变量
  5. plm 回归应该相应地存储在 inside_2way_A,within_2way_B

所以最后,我需要:

Data_A
turn cogs tfa SALE omegaACF_A domegaACF_A debt ddebt dsales
 1     1   1    1     0.1        NA         1    NA     NA
 2     2   2    2     0.3        0.2        2     1      1
 3     3   3    3     0.6        0.3        3     1      1
 4     4   4    4     0.9        0.3        4     1      1

Data_B
turn cogs tfa SALE omegaACF_B domegaACF_B debt ddebt dsales
 5     5   5    5     1.1        NA         5    NA     NA
 6     6   6    6     1.5        0.4        6     1      1
 7     7   7    7     1.7        0.2        7     1      1
 8     8   8    8     2.0        0.3        8     1      1

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    一种方法是使用不同的lapply() 命令将 ACF 估计和 omega 计算与摘要创建分开。由于您没有提供任何示例数据,因此这是一个盲目的尝试,但请尝试以下操作。请注意,我假设每个数据集都具有相同的列名!如果它不能解决您的问题,我将删除我的答案。

    data <- list(Data_A, Data_B, Data_C) 
    Estimates <- lapply(data, function(x){
    prodest::prodestACF(x$turn, fX = x$cogs, sX = x$tfa, pX = x$cogs, idvar = x$ID, timevar = x$Year, 
                                  R = 100, cX = NULL, opt = 'DEoptim', theta0 = NULL, cluster = NULL)  
    }
    Summaries_estimates <- lapply(Estimates, summary) 
    Omegas <- lapply(Estimates, function(x) prodest::omega(x)) 
    Summaries_omega <- lapply(Omegas, summary)
    

    使用循环的替代方法

    既然你问了,也可以定义一个循环将所有内容循环在一起,尽管这通常要慢得多。为此,我们必须定义带有ACF 等结果的空列表,并遍历我们已经创建的data.frames 列表。

        data <- list(Data_A, Data_B, Data_C) 
        Estimates <- list() 
        Summaries_estimates <- list() 
        Omegas <- list() 
        Summaries_omegas <- list() 
        for(i in 1:(length(data))){
        Estimates[[i]] <- prodest::prodestACF(data[[i]]$turn, fX = data[[i]]$cogs, sX = data[[i]]$tfa, pX = data[[i]]$cogs, idvar = data[[i]]$ID, timevar = data[[i]]$Year, 
                                      R = 100, cX = NULL, opt = 'DEoptim', theta0 = NULL, cluster = NULL)  
        }
        Summaries_estimates[[i]] <- summary(Estimates[[i]]) 
        Omegas[[i]] <- prodest::omega(Estimates[[i]])) 
        Summaries_omega[[i]] <- summary(Omegas[[i]])
    }
     
    

    【讨论】:

    • 我已经添加了数据集的链接。尽管有这个想法,您已经说过,是否有任何解决方案可以将带有 ACF、omega 和其他部分的块作为一个循环循环,因为唯一的变化是使用的变量,以及它们所在的数据帧或变量的名称被存储了吗?
    • 我添加了一个仅使用 for()-loop 的解决方案。这就是你的想法吗?
    • 我已经更新了 UPD2 问题,并列出了我想要得到的输出。因此,可能我不需要循环内的摘要,但我需要将估计的结果prodest、估计变量omegaplm 回归的结果存储在相应更改名称的创建对象中,例如, ACF_AACF_BACF_C,要在每个数据集中创建的增长变量。如果仍不清楚,请通知。
    • 我也可以问你,例如,我已经按照你的例子得到了 Omegas 列表中列出的一些 omegas 输出。那么我如何在初始数据集 omegaACF_A、omegaACF_B 中创建一个新变量,该变量将从相应索引的列表中获取它们的值。我的意思是,如果列表 Omegas 中有一个从 Data_A 的值创建的对象,我怎样才能得到这个数字并将它们作为 omegaACF_A 变量输入到数据框 Data_A 中?
    猜你喜欢
    • 2021-06-19
    • 1970-01-01
    • 2020-08-31
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    相关资源
    最近更新 更多