这是我拥有的数据框:
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中绘制条形图:
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
另一方面,有可能使用map
中的purrr
进行相同的操作;但是我仍然无法将其应用于动态变量。您对此有什么建议吗?
答案 0 :(得分:0)
我认为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
,它可以在多列上运行相同的函数,因此您不必使用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")))