使用dplyr在R中自动创建变量的最佳方法

Tem*_*Rex 3 r dplyr

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,P90P95)指示是否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像第一种方法那样明确地输入内容?

Hon*_*Ooi 6

当然,你不需要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)