[英]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.