2017-08-03 145 views
0

给定一个字符向量,我想循环遍历一个赋值名称的函数。具有赋值名称向量和函数的R for循环

uprop是 “data.frame”(1000个观察和20列),如在下面列出的输出:

> class(uprop) 

[1] "data.frame" 

而且目标,和WeightCount是所有列名中的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 
} 

预先感谢帮助新手。

回答

3

不要创建一堆不同的变量;创建值列表,而不是用

cust_dept_list <- c('CAST', 'CHEG', 'PHYS') 
uprop_data <- lapply(cust_dept_list, function(x) 
    subset(uprop, Department == x, select = c(Source, Target, WeightCount)) 
) 

,然后你可以用

uprop_data[["CAST"]] 
uprop_data[["CHEG"]] 
... 

访问data.frames,它会更容易循环功能,对这些数据集在列表中以供将来分析。在how do I make a list of data.frames

+0

uprop已经是一个data.frame,并且每个输出data.frame的大小不同。> class(cheg_prop_data) [1]“tbl_df”“tbl”“data.frame” – adm

+1

@adm我不确定那是多么的相关。列表中的每个项目可以有不同数量的行。 – MrFlick

+0

对不起我的业余爱好,但'uprop' data.frame有1000个观测值和20个变量,那么输出'cheg_uprop_data'数据帧有200个观测值和3列。 – adm

1

查看相关答复只有极少数情况下,您应该通过循环子集来分配全局变量。我会建议学习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 
+0

我注意到%>%运算符用于许多不同的库中,您加载了哪一个? @ Scott Stoltzman | dplyr,magrittr等... – adm

+0

@adm - %>%here,group_by()和select()以及nest()都通过库(tidyverse)加载。你可以使用tidyr :: nest()dplyr :: group_by()和管道运算符“%>%”来自magittr或dplyr。老实说,如果你不介意加载所有的软件包并且在他们周围工作,那么这种全新的软件就是我最喜欢的软件包之一 –