【问题标题】:Is there a way to do a loop in R studio like in Stata有没有办法像在 Stata 中一样在 R 工作室中进行循环
【发布时间】:2020-10-12 13:35:21
【问题描述】:

我需要通过对其他变量求和来创建一个变量。我需要创建

Output_total=Output_manufacturing+Output_agriculture
Prices_total=Prices_manufacturing+Prices_agriculture

我会这样做

global var "Output Prices"
foreach v of global var {
g `var'_Total=`var'_manufacturing +`var'_Agriculture
}

我正在努力

 var <- c("Output","Prices")
for (i in length(var)) {
  data<-data %>% mutate( as.numeric(paste(data, i,"_Total"))= as.numeric(paste(data, i,"_manufacturing"))+ as.numeric(paste(data, i,"_agriculture"))) }

但它不起作用。有什么想法吗?

【问题讨论】:

    标签: r loops dplyr


    【解决方案1】:

    玩具数据:

    set.seed(1)
    data <- data.frame(Output_manufacturing = runif(5),
                       Output_agriculture   = runif(5),
                       Prices_manufacturing = runif(5),
                       Prices_agriculture   = runif(5))
    

    我认为你想要做的是这个。

    vars <- c("Output","Prices")
    for (var in vars) {
     data <- data %>%
      mutate(!!sym(paste0(var, "_Total")) := 
              !!sym(paste0(var, "_manufacturing")) + 
              !!sym(paste0(var, "_agriculture")))
    }
    
    data
    #>   Output_manufacturing Output_agriculture Prices_manufacturing Prices_agriculture Output_Total Prices_Total
    #> 1            0.2655087         0.89838968            0.2059746          0.4976992    1.1638983    0.7036738
    #> 2            0.3721239         0.94467527            0.1765568          0.7176185    1.3167992    0.8941753
    #> 3            0.5728534         0.66079779            0.6870228          0.9919061    1.2336512    1.6789289
    #> 4            0.9082078         0.62911404            0.3841037          0.3800352    1.5373218    0.7641389
    #> 5            0.2016819         0.06178627            0.7698414          0.7774452    0.2634682    1.5472866
    

    dplyr 的另一种方式是:

    library(dplyr)
    vars <- c("Output","Prices")
    
    data <- data %>% rowwise()
    
    for (var in vars)
     data <- data %>% mutate("{var}_Total" := sum(c_across(starts_with(var))))
    
    data <- data %>% ungroup()
    
    

    使用基础 R:

    # vars you want to sum
    vars <- c("Output","Prices")
    
    # get position of the vars to sum
    v <- grep(paste0("^", vars, collapse = "|"), names(data))
    
    # sum cols
    data[vars] <- lapply(split.default(data[v], sub('(.*)_.*','\\1_Total', names(data[v]))), rowSums)
    

    这对于您想要求和的列数很灵活。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-03
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 2014-03-13
      • 2014-05-18
      • 2010-09-30
      • 1970-01-01
      相关资源
      最近更新 更多