【问题标题】:R for-loop with assignment name vector and function具有赋值名称向量和函数的 R for 循环
【发布时间】:2017-08-03 20:12:07
【问题描述】:

给定一个字符向量,我想循环一个带有名称分配的函数。

uprop 是一个“data.frame”(1000 个观测值和 20 列),如下面的输出所示:

> class(uprop)

[1] "data.frame"

DepartmentSourceTargetWeightCount都是uprop中的列名

假设我们需要简化这个重复的任务:

CAST_uprop_data <- subset(uprop, Department == "CAST", select = c(Source, Target, WeightCount))
CHEG_uprop_data <- subset(uprop, Department == "CHEG", select = c(Source, Target, WeightCount))
PHYS_uprop_data <- subset(uprop, Department == "PHYS", select = c(Source, Target, WeightCount))

这里CAST_uprop_data也是一个data.frame。 (100 个观察和 3 列) 我可以使用字符名称创建一个向量变量cust_dept_list

cust_dept_list <- c('CAST', 'CHEG', 'PHYS')

但是,我不知道如何遍历名称并让它运行并分配每个名称?

这是我的尝试:

for (i in c(cust_dept_list)){
  print(paste0(i,"_uprop_data")) <- subset(uprop, Department == i, select = c(Source, Target, WeightCount)), i
}

提前感谢您帮助新手。

【问题讨论】:

    标签: r variables for-loop


    【解决方案1】:

    不要创建一堆不同的变量;用

    创建一个值列表
    cust_dept_list <- c('CAST', 'CHEG', 'PHYS')
    uprop_data <- lapply(cust_dept_list, function(x) 
        subset(uprop, Department == x, select = c(Source, Target, WeightCount))
    )
    

    然后您可以使用

    访问 data.frames
    uprop_data[["CAST"]]
    uprop_data[["CHEG"]]
    ...
    

    并且可以更轻松地在列表中的这些数据集上循环函数以供将来分析。在how do I make a list of data.frames查看相关回复

    【讨论】:

    • uprop 已经是一个 data.frame 并且每个输出 data.frame 的大小都会不同。> class(cheg_prop_data) [1] "tbl_df" "tbl" "data.frame"
    • @adm 我不确定这有什么关系。列表中的每个项目可以有不同的行数。
    • 抱歉我的业余爱好,但是uprop data.frame 有 1000 个观察值和 20 个变量,那么输出 cheg_uprop_data data.frame 有 200 个观察值和 3 列。
    • 1000 个观察值和 20 个
    • 没关系...它起作用了,我没有意识到 data.frames 可以堆叠表级别。对uprop_data[["CAST"]] 的访问无效(NULL),但 `uprop_data[[1]] 有效。谢谢!
    【解决方案2】:

    只有极少数情况下,您应该通过遍历子集来分配全局变量。我建议学习 tidyverse。

    如果你不明白下面的任何内容,请查一下,因为 %>% 运算符将为你节省大量时间和精力(同时让代码对其他人可读)。

    您将使用与数据框非常相似的“tibble”。在此,您只需按部门分组并创建一个包含所有数据的单独行!

    library(tidyverse)
    
    unprop_data = data.frame(Department = c(rep("CAST",1000),rep("CHEG",1000),rep("PHYS",1000)),
                         Source = rnorm(3000),
                         Target = rnorm(3000),
                         WeightCount = rnorm(3000))
    
    grouped_data = unprop_data %>%
      group_by(Department) %>%
      select(Source, Target, WeightCount) %>%
      nest()
    

    结果如下:

    > grouped_data
    # A tibble: 3 x 2
      Department                 data
          <fctr>               <list>
    1       CAST <tibble [1,000 x 3]>
    2       CHEG <tibble [1,000 x 3]>
    3       PHYS <tibble [1,000 x 3]>
    

    如果您出于某种原因需要在 for 循环中打印所有这些(对于每个部门 1000 行来说似乎很粗糙),则如下所示:

    for(dept in unique(grouped_data$Department)){
      print(dept)
      print("###########################")
      print(
        grouped_data %>% 
          filter(Department == dept) %>%
          unnest()
      )
    }
    

    返回:

    [1] "CAST"
    [1] "###########################"
    # A tibble: 1,000 x 4
       Department     Source      Target WeightCount
           <fctr>      <dbl>       <dbl>       <dbl>
     1       CAST -0.3781853 -0.59457662   0.2796963
     2       CAST  0.7261541 -1.06344758   1.1874874
     3       CAST -0.1207312  0.56961950   0.2082236
     4       CAST -1.5467661  1.23693964  -0.9732976
     5       CAST -1.6626831  0.09252543  -0.3003913
     6       CAST -0.2783635 -0.84363946   2.0588511
     7       CAST  1.6981061  0.13755764  -0.3935691
     8       CAST  0.4900337 -0.73662209   0.8861508
     9       CAST  0.3971949 -0.23047428   1.6226582
    10       CAST  0.7721574 -0.69117961  -0.4547899
    # ... with 990 more rows
    [1] "CHEG"
    [1] "###########################"
    # A tibble: 1,000 x 4
       Department     Source     Target WeightCount
           <fctr>      <dbl>      <dbl>       <dbl>
     1       CHEG -0.7843984 -0.8788216  0.60030359
     2       CHEG -0.5636669 -2.2283878 -0.16178492
     3       CHEG  0.9024084 -1.5052453 -1.58803972
     4       CHEG  1.7662237  1.2125255 -0.91229428
     5       CHEG  0.3950654 -0.8283651  0.07402481
     6       CHEG  0.3928973 -1.3650744 -0.75262682
     7       CHEG  1.1298127  1.4765888 -0.76059162
     8       CHEG  0.4787867  0.6041770 -1.23313321
     9       CHEG -1.4474401 -0.6747809  0.78431441
    10       CHEG  0.6463868  0.2558378 -1.34131546
    # ... with 990 more rows
    [1] "PHYS"
    [1] "###########################"
    # A tibble: 1,000 x 4
       Department     Source      Target WeightCount
           <fctr>      <dbl>       <dbl>       <dbl>
     1       PHYS  0.1425978 -1.01397581 -0.16573546
     2       PHYS -1.2572684 -1.13069956 -0.61870063
     3       PHYS  1.2089882  1.51020970 -1.43474343
     4       PHYS -0.6357010 -0.07362852  0.06683348
     5       PHYS -1.6402587 -1.35273300  0.14436313
     6       PHYS -0.9408105 -1.52515527 -0.06860152
     7       PHYS  0.3143868  0.11814597 -0.37823801
     8       PHYS -0.3232879  0.15408677 -0.62820531
     9       PHYS  0.3152122 -0.72634466 -1.71955337
    10       PHYS  0.7268282 -0.20872075  0.30780981
    # ... with 990 more rows
    

    【讨论】:

    • 我注意到 %>% 运算符用于许多不同的库中,您加载哪一个? @斯科特斯托尔兹曼 | dplyr、magrittr 等...
    • @adm - 这里的 %>% 以及 group_by() 和 select() 以及 nest() 都是通过 library(tidyverse) 加载的。您可以使用 tidyr::nest() dplyr::group_by() 并且管道运算符“%>%”确实来自 magittr 或 dplyr。老实说,如果您不介意加载所有包并解决它们,tidyverse 是我最喜欢的包之一
    猜你喜欢
    • 2016-04-10
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2019-05-10
    • 1970-01-01
    • 2019-12-27
    相关资源
    最近更新 更多