我正在嘗試撰寫一個自定義函式來使用 dplyr 管道應用于某些資料幀。此函式應該對選定的列進行多次操作,例如用點替換逗號、提取數字并將它們轉換為數值。這是一個簡化的示例:
library(dplyr)
library(stringr)
parties <- c("SPD", "B90_Gruene")
df <- data.frame(
SPD = c("26 %", "25 %", "25 %", "26 %", "26 %"),
B90_Gruene =c ("17 %", "16 %", "17 %", "15 %", "15 %"))
rem_per_cent <- function(.data, columns) {
nd <- .data
for (v in columns){
nd <- nd %>% mutate("{{v}}" := unlist(str_split(.data[[v]], "%"))[1])
}
return(nd)
}
df %>% rem_per_cent(parties)
輸出錯誤。第一個值替換所有列:
SPD B90_Gruene "SPD" "B90_Gruene"
1 26 % 17 % 26 17
2 25 % 16 % 26 17
3 25 % 17 % 26 17
4 26 % 15 % 26 17
5 26 % 15 % 26 17
更換unlist()[1]用head(,1)給人不太一樣。
當unlist()[1]被洗掉時,結果是 str_split 的輸出是正確的:
SPD B90_Gruene "SPD" "B90_Gruene"
1 26 % 17 % 26 , 17 ,
2 25 % 16 % 25 , 16 ,
3 25 % 17 % 25 , 17 ,
4 26 % 15 % 26 , 15 ,
5 26 % 15 % 26 , 15 ,
我想了解為什么這個功能不起作用。其次,當我使用 時"{{v}}",想法是將替換原始變數而不是創建那些奇怪的列。非常感謝!
uj5u.com熱心網友回復:
str_split回傳字符向量串列。unlist(str_split(.data[[v]], "%"))[1]第一個串列的第一個元素也是如此,然后將其分配給資料框的所有行。
mutate 的正確語法是{{v}},不帶雙引號 ( ")。使用雙引號,您可以有效地硬編碼變數名稱以包含引號,因此您可以創建新列,而不是覆寫現有列。
你可以通過rowwise()在你的管道中添加一個來獲得你想要的效果:
rem_per_cent <- function(.data, columns) {
nd <- .data
for (v in columns){
nd <- nd %>% rowwise() %>% mutate({{v}} := unlist(str_split(.data[[v]], "%"))[1])
}
return(nd)
}
df %>% rem_per_cent(parties)
# A tibble: 5 × 2
# Rowwise:
SPD B90_Gruene
<chr> <chr>
1 "26 " "17 "
2 "25 " "16 "
3 "25 " "17 "
4 "26 " "15 "
5 "26 " "15 "
要洗掉 rowwise 注釋,請ungroup()向管道添加。
我們可以避免使用自定義函式
df %>% rowwise() %>% mutate(across(everything(), ~unlist(str_split(.x, "%"))[1]))
這給出了相同的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/318471.html
上一篇:在PHP中通過參考傳遞變數的問題
