我第一次來這里,我會盡可能清楚地向你解釋我的問題。我正在處理以像素形式包含在農場中的侵蝕資料(例如,1 個農場 = 10 個像素,所以我的 df 中有 10 行),為此我在串列中有 4 個 df,我想為每個農場計算侵蝕的平均值。我想過一個關于侵蝕欄位名稱的回圈,但我的問題是我的 df 沒有確切的名稱(ERO13 或 ERO17)。我不想處理該欄位的位置,因為它可以在 df 之間更改,只有名稱是可變的。
這是一個例子:
df1 <- data.frame(ID = c(1,1,2), ERO13 = c(2,4,6))
df2 <- data.frame(ID = c(4,4,6), ERO17 = c(4,5,12))
lst_df <- list(df1,df2)
for (df in lst_df){
cur_df <- df
cur_df <- cur_df %>%
group_by(ID) %>%
summarise(current_name_of_erosion_field = mean(current_name_of_erosion_field))
}
我試過了
for (df in lst_df){
cur_df <- df
cur_camp <- names(cur_df)[2]
cur_df <- cur_df %>%
group_by(ID) %>%
summarise(cur_camp = mean(cur_camp))
}
但首先不起作用,因為它是字串字符,而不是包含字串字符的變數,并且它適用于位置。
我怎樣才能在這里建立 current_name_of_erosion_field ?
uj5u.com熱心網友回復:
我們可以將其轉換為symbol 并評估 ( !!) 或傳遞字串 across。此外,當我們使用for回圈時,請確保創建一個list來存盤輸出。此外,要從創建的物件分配,請使用:=with!!
out <- vector('list', length(lst_df))
for (i in seq_along(lst_df)){
cur_df <- lst_df[[i]]
cur_camp <- names(cur_df)[2]
cur_df <- cur_df %>%
group_by(ID) %>%
summarise(!!cur_camp := mean(!! sym(cur_camp)))
out[[i]] <- cur_df
}
-輸出
> out
[[1]]
# A tibble: 2 × 2
ID ERO13
<dbl> <dbl>
1 1 3
2 2 6
[[2]]
# A tibble: 2 × 2
ID ERO17
<dbl> <dbl>
1 4 4.5
2 6 12
或者可以使用 across
out <- vector('list', length(lst_df))
for (i in seq_along(lst_df)){
cur_df <- lst_df[[i]]
cur_camp <- names(cur_df)[2]
cur_df <- cur_df %>%
group_by(ID) %>%
summarise(across(all_of(cur_camp), mean))
out[[i]] <- cur_df
}
-輸出
> out
[[1]]
# A tibble: 2 × 2
ID ERO13
<dbl> <dbl>
1 1 3
2 2 6
[[2]]
# A tibble: 2 × 2
ID ERO17
<dbl> <dbl>
1 4 4.5
2 6 12
uj5u.com熱心網友回復:
一種稍微不同的方法是bind資料幀,并用于pivot_longer將侵蝕名稱與侵蝕值分開。然后,您可以取值的平均值而無需指定名稱。
library(tidyverse)
df1 <- data.frame(ID = c(1,1,2), ERO13 = c(2,4,6))
df2 <- data.frame(ID = c(4,4,6), ERO17 = c(4,5,12))
bind_rows(df1, df2) %>%
pivot_longer(starts_with('ERO'),
names_to = 'ERO',
values_drop_na = TRUE) %>%
group_by(ID, ERO) %>%
summarize(value = mean(value))
#> `summarise()` has grouped output by 'ID'. You can override using the `.groups` argument.
#> # A tibble: 4 x 3
#> # Groups: ID [4]
#> ID ERO value
#> <dbl> <chr> <dbl>
#> 1 1 ERO13 3
#> 2 2 ERO13 6
#> 3 4 ERO17 4.5
#> 4 6 ERO17 12
由reprex 包于 2022-01-14 創建 (v2.0.0 )
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/411594.html
標籤:
上一篇:避免for回圈-R
下一篇:在mutate中應用函式或回圈
