簡體   English   中英

R studio:編寫一個 for 循環,將自定義函數應用於輸入向量,並為該向量中的每個元素輸出一個單獨的數據幀

[英]R studio: Write a for loop to apply a customized function to a vector of inputs, and outputs a separate dataframe for each element in that vector

我有一個數據框,其中包含每個水果類別的一些參數的下限和上限。 它看起來像這樣:

+----------+-----------+-------+-------+
| Category | Parameter | Upper | Lower |
+----------+-----------+-------+-------+
| Apple    | alpha     | 10    | 20    |
+----------+-----------+-------+-------+
| Apple    | beta      | 20    | 30    |
+----------+-----------+-------+-------+
| Orange   | alpha     | 10    | 20    |
+----------+-----------+-------+-------+
| Orange   | beta      | 30    | 40    |
+----------+-----------+-------+-------+
| Orange   | gamma     | 50    | 60    |
+----------+-----------+-------+-------+
| Pear     | alpha     | 10    | 30    |
+----------+-----------+-------+-------+
| Pear     | beta      | 20    | 40    |
+----------+-----------+-------+-------+
| Pear     | gamma     | 20    | 30    |
+----------+-----------+-------+-------+
| Banana   | alpha     | 40    | 50    |
+----------+-----------+-------+-------+
| Banana   | beta      | 20    | 40    |
+----------+-----------+-------+-------+

我編寫了一個函數,在其中傳入此數據框、水果名稱和序列所需的長度:

library(purrr)

param_grid <- function(df, fruit, length) {
  df_fruit <- df %>%
    filter(Category == fruit) 
  
  map2(df_fruit$Upper, df_fruit$Lower, seq, length.out = length) %>%
    set_names(df_fruit$Parameter) %>%
    cross_df()
}

輸出

param_grid(df, "Apple", length=100)

# A tibble: 10,000 x 2
   alpha  beta
   <dbl> <dbl>
 1  10      20
 2  10.1    20
 3  10.2    20
 4  10.3    20
 5  10.4    20
 6  10.5    20
 7  10.6    20
 8  10.7    20
 9  10.8    20
10  10.9    20
# … with 9,990 more rows

輸出

param_grid(df, "Orange", length=100)

# A tibble: 1,000,000 x 3
   alpha  beta gamma
   <dbl> <dbl> <dbl>
 1  10      30    50
 2  10.1    30    50
 3  10.2    30    50
 4  10.3    30    50
 5  10.4    30    50
 6  10.5    30    50
 7  10.6    30    50
 8  10.7    30    50
 9  10.8    30    50
10  10.9    30    50
# … with 999,990 more rows

輸出

param_grid(df, "Pear", length=100)

# A tibble: 1,000,000 x 3
   alpha  beta gamma
   <dbl> <dbl> <dbl>
 1  10      20    20
 2  10.2    20    20
 3  10.4    20    20
 4  10.6    20    20
 5  10.8    20    20
 6  11.0    20    20
 7  11.2    20    20
 8  11.4    20    20
 9  11.6    20    20
10  11.8    20    20
# … with 999,990 more rows

現在,我想寫一個 for 循環來允許這個函數應用於多個水果:

names <- c("Apple","Orange","Pear")

for (i in names){
  results <- param_grid(df = df, fruit = i, length = 100)
  print(head(results),10)
  }

這工作正常,但它總共返回 3 個數據幀:

    alpha beta
1 20.00000   30
2 19.89899   30
3 19.79798   30
4 19.69697   30
5 19.59596   30
6 19.49495   30
     alpha beta gamma
1 20.00000   40    60
2 19.89899   40    60
3 19.79798   40    60
4 19.69697   40    60
5 19.59596   40    60
6 19.49495   40    60
     alpha beta gamma
1 30.00000   40    30
2 29.79798   40    30
3 29.59596   40    30
4 29.39394   40    30
5 29.19192   40    30
6 28.98990   40    30

有沒有辦法編輯這個 for 循環,以便我可以分別為 Apple、Orange、Pear 提供3 個單獨的數據幀 或者它可能是 3 個數據幀,每個數據幀在一個大的嵌套數據幀(例如 DF[[Apple]]、DF[[Orange]]..)中都可以調用/子集?

非常感謝你的幫助!

我們在for循環上循環並只print ing。 相反,我們可以存儲在一個list

lst1 <- vector('list', length(names))
names(lst1) <- names
for (i in names){
  results <- param_grid(data=df, fruit = i, length = 100)
  lst1[[i]] <- results
  }

然后,檢查創建的list的結構

str(lst1)

我們可以使用$[[

lst1[[1]]
lst1[[2]]

如果我們想創建不同的對象,其對象名稱與 'names' 向量的元素相同

list2env(lst1, .GlobalEnv)

但是,最好存儲在list並使用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM