2017-08-03 96 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。老實說,如果你不介意加載所有的軟件包並且在他們周圍工作,那麼這種全新的軟件就是我最喜歡的軟件包之一 –