df <- as.data.frame(cbind(c(1:10), c(15, 70, 29, 64, 57, 29, 10, 80,81, 71)))
V1 V2
1 1 15
2 2 70
3 3 29
4 4 64
5 5 57
6 6 29
7 7 10
8 8 80
9 9 81
10 10 71
cuts <- c(5, 10, 90, 95)
Run Code Online (Sandbox Code Playgroud)
我想对所有创建逻辑变量(在这种情况下,四)切值x(例如P5,P10,P90和P95)指示是否v2 <= x."手动"添加变量的简单方法不会超出一小部分:
df %<>%
mutate( P5 = V2 <= 5) %>%
mutate(P10 = V2 <= 10) %>%
mutate(P90 = V2 <= 90) %>%
mutate(P95 = V2 <= 95)
V1 V2 P5 P10 P90 P95
1 1 15 FALSE FALSE TRUE TRUE
2 2 70 FALSE FALSE TRUE TRUE
3 3 29 FALSE FALSE TRUE TRUE
4 4 64 FALSE FALSE TRUE TRUE
5 5 57 FALSE FALSE TRUE TRUE
6 6 29 FALSE FALSE TRUE TRUE
7 7 10 FALSE TRUE TRUE TRUE
8 8 80 FALSE FALSE TRUE TRUE
9 9 81 FALSE FALSE TRUE TRUE
10 10 71 FALSE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
显然,为了使数据保持"整洁"的格式,gather(year, islegal, c(3;6))应该应用最终结果.
我尝试的另一种方法是做
do.call(rbind, lapply(cuts, function(x) {
df %>% mutate(year = x, islegal = V2 <= x)
})) %>% spread(year, islegal)
V1 V2 5 10 90 95
1 1 15 FALSE FALSE TRUE TRUE
2 2 70 FALSE FALSE TRUE TRUE
3 3 29 FALSE FALSE TRUE TRUE
4 4 64 FALSE FALSE TRUE TRUE
5 5 57 FALSE FALSE TRUE TRUE
6 6 29 FALSE FALSE TRUE TRUE
7 7 10 FALSE TRUE TRUE TRUE
8 8 80 FALSE FALSE TRUE TRUE
9 9 81 FALSE FALSE TRUE TRUE
10 10 71 FALSE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)
显然,我会放弃决赛spread()以保持数据"整洁".
问题:是否有{dplyr}比第二种方法更好或更通用的方法来自动化变量创建(像这里的像分位数一样的截止,或虚拟或类似),不需要cuts像第一种方法那样明确地输入内容?
当然,你不需要dplyr来做这么简单的事情.
names(cuts) <- paste0("p", cuts)
data.frame(df, lapply(cuts, function(x) df$V2 <= x))
V1 V2 p5 p10 p90 p95
1 1 15 FALSE FALSE TRUE TRUE
2 2 70 FALSE FALSE TRUE TRUE
3 3 29 FALSE FALSE TRUE TRUE
4 4 64 FALSE FALSE TRUE TRUE
5 5 57 FALSE FALSE TRUE TRUE
6 6 29 FALSE FALSE TRUE TRUE
7 7 10 FALSE TRUE TRUE TRUE
8 8 80 FALSE FALSE TRUE TRUE
9 9 81 FALSE FALSE TRUE TRUE
10 10 71 FALSE FALSE TRUE TRUE
Run Code Online (Sandbox Code Playgroud)