[英]errors when using R function using variables/column names as arguments to create a new variable using mutate and case_when
[英]How to apply map function to dynamic column names in mutate and case_when function?
這是我擁有的數據框:
df <- data.frame(
id = c(1,2,3,4,5),
a_1_area = c(3,10,4,0,15),
a_2_area = c(2,1,1,0,3),
a_3_area = c(12,3,0,3,1),
a_4_area = c(9,7,8,0,0),
a_5_area = c(1,2,0,2,2)
)
自定義范圍被添加到df
以在ggplot2中繪制barplot:
df %>% mutate(a_1_range=case_when(
a_1_area == 0 ~ "0",
a_1_area >= 1 & a_1_area < 5 ~ "1-4",
a_1_area >= 5 & a_1_area <10 ~ "5-9",
a_1_area >= 10 & a_1_area <15 ~ "10-14",
a_1_area >= 15 ~ "15-",
TRUE ~ "999")
)
輸出:
id a_1_area a_2_area a_3_area a_4_area a_5_area a_1_range
1 1 3 2 12 9 1 1-5
2 2 10 1 3 7 2 6-10
3 3 4 1 0 8 0 1-5
4 4 0 0 3 0 2 0
5 5 15 3 1 0 2 11-15
我對其余的列繼續執行此操作; a_2_area
, a_3_area
, a_4_area
和a_5_area
使用for
循環。
for (i in 1:5) {
df %>% mutate(!!colname[i]:=case_when(
!!sym(varname[i]) == 0 ~ "0",
!!sym(varname[i]) >= 1 & !!sym(varname[i]) < 5 ~ "1-4",
!!sym(varname[i]) >= 5 & !!sym(varname[i]) <10 ~ "5-9",
!!sym(varname[i]) >= 10 & !!sym(varname[i]) <15 ~ "10-14",
!!sym(varname[i]) >= 15 ~ "15-",
TRUE ~ "999")) -> df
}
輸出:
id a_1_area a_2_area a_3_area a_4_area a_5_area a_1_range a_2_range a_3_range a_4_range
1 1 3 2 12 9 1 1-4 1-4 10-14 5-9
2 2 10 1 3 7 2 10-14 1-4 1-4 5-9
3 3 4 1 0 8 0 1-4 1-4 0 5-9
4 4 0 0 3 0 2 0 0 1-4 0
5 5 15 3 1 0 2 15- 1-4 1-4 0
a_5_range
1 1-4
2 1-4
3 0
4 1-4
5 1-4
另一方面,有可能使用purrr
map
進行相同的操作; 但是我仍然無法將其應用於動態變量。 您對此有什么建議嗎?
我認為在這里cut
可能是一個不錯的選擇
cols <- grep("area$", names(df), value = TRUE)
df[paste0(cols, "_range")] <- lapply(df[cols], function(x) cut(x,
breaks = c(0, 1, 5, 10, 15, Inf),
labels = c("0", "1-4", "5-9", "10-14", "15-"), include.lowest = TRUE))
也可以集成在dplyr
library(dplyr)
df %>%
mutate_at(vars(ends_with("area")), list(range = ~cut(.,
breaks = c(0, 1, 5, 10, 15, Inf),
labels = c("0", "1-4", "5-9", "10-14", "15-"), include.lowest = TRUE)))
或者,如果您更喜歡使用case_when
, mutate_at
可以使用case_when
, mutate_at
可以在多個列上運行相同的函數,因此您不必使用for
循環
df %>% mutate_at(vars(ends_with("area")), list(area =
~case_when(. == 0 ~ "0",
. >= 1 & . < 5 ~ "1-4",
. >= 5 & . <10 ~ "5-9",
. >= 10 & . <15 ~ "10-14",
. >= 15 ~ "15-",
TRUE ~ "999")))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.