R 在变异管道中时的情况

R 在变异管道中时的情况,r,dplyr,R,Dplyr,在dplyr::mutate调用中,当的行为与其他命令不同时,似乎是dplyr::case\u。例如: library(dplyr) case_when(mtcars$carb <= 2 ~ "low", mtcars$carb > 2 ~ "high") %>% table 但是当在一个变异链中时,将case\u放入: mtcars %>% mutate(cg = case_when(carb <= 2 ~ "low",

dplyr::mutate
调用中,当的行为与其他命令不同时,似乎是
dplyr::case\u。例如:

library(dplyr)

case_when(mtcars$carb <= 2 ~ "low",
          mtcars$carb > 2 ~ "high") %>% 
  table
但是当
在一个变异链中时,将case\u放入:

mtcars %>% 
  mutate(cg = case_when(carb <= 2 ~ "low",
                        carb > 2 ~ "high"))
虽然这个很好用

mtcars %>% 
  mutate(cg = carb %>% 
           cut(c(0, 2, 8)))

我们可以使用
$

mtcars %>%  
     mutate(cg = case_when(.$carb <= 2 ~ "low",  .$carb > 2 ~ "high")) %>%
    .$cg %>%
    table()
# high  low 
#  15   17 
mtcars%>%
突变(cg=情况_,当(.$carb 2~“高”))%>%
.$cg%>%
表(
#高低
#  15   17 

感谢@sumedh:@hadley,这是
案例的一个已知缺陷,当
:

case\u when()
仍处于试验阶段,目前不起作用 内部
mutate()
。这将在将来的版本中修复


除了上面@akrun的答案外,请注意,
case_when()
的右括号不能放在它自己的行中

例如,此操作正常:

mtcars %>%  
   mutate(cg = case_when(
      .$carb <= 2 ~ "low",  .$carb > 2 ~ "high")) 
mtcars%>%
变异(cg=情况_,当(
($carb 2~“高”))
但这并不是:

mtcars %>%  
   mutate(cg = case_when(
      .$carb <= 2 ~ "low",  .$carb > 2 ~ "high")
      ) 
mtcars%>%
变异(cg=情况_,当(
.$carb 2~“高”)
) 

dplyr
0.7.0版开始,
范围内工作时的
情况如下:

library(dplyr) # >= 0.7.0
mtcars %>% 
  mutate(cg = case_when(carb <= 2 ~ "low",
                        carb > 2  ~ "high"))
library(dplyr)#>=0.7.0
mtcars%>%
突变(cg=情况_,当(碳水化合物2~“高”))
有关详细信息:

library(dplyr)#加载dplyr包
content150_强化%#创建新变量
mutate(number_yn=case_when(#使用mutate创建新列

number>=18&number在我的例子中,quasiquotation帮助很大。您可以提前创建一组引用的公式来定义变异规则(或者使用第一个公式中的已知列名,或者受益于
!!
,并像第二个公式中那样动态创建规则),然后在
组合时在
mutate
-
case\u中使用

库(dplyr)
图书馆(rlang)
型头百分比(10升)
#>mpg气缸显示hp drat wt qsec vs am齿轮carb测试
#>121.06160.01103.902.62016.46014四
#>221.06160.01103.902.87517.02014四
#>3 22.8 4 108.0 93 3.85 2.320 18.61 1 4 4 4
#>4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1三
#>518.78360.01753.1534.44017.020302三
#>6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1三
#>7 14.3 8 360.0 245 3.21 3.570 15.84 0 3 4三
#>824.4146.762 3.693.19020.00 1 0 4 2 4
#>9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2 4
#>1019.26167.6123 3.923.44018.301044四
我更喜欢这种解决方案,因为它允许创建复杂的规则,例如使用带有LHS条件和RHS值的
map2
生成引用公式

库(rlang)
图书馆(purrr)
map2(c(3,4,5),c(“三”,“四”,“五”),~quo(齿轮=!!.x~!!.y))
#> [[1]]
#> 
#>表达式:^gear==3~“三”
#>环境:00000000 14286520
#> 
#> [[2]]
#> 
#>表达式:^gear==4~“四”
#>环境:00000000 1273D0E0
#> 
#> [[3]]
#> 
#>表达式:^gear==5~“五”
#>环境:00000000 125870e0
在不同的地方使用它,应用于不同的数据集,而无需在每次需要复杂变异时手动键入所有规则

作为问题的最终答案,7个额外的符号和两个括号解决了这个问题

库(rlang)
图书馆(dplyr)
mtcars%>%
变异(当(!!!quos(档位==3L~“三”,档位!=3L~“非三”))时,测试=案例_)%>%
水头(10升)
#>mpg气缸显示hp drat wt qsec vs am齿轮carb测试
#>121.06160.01103.902.62016.46014不是三个
#>2 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4非三
#>3 22.8 4 108.0 93 3.85 2.320 18.61 1 4 1不是三个
#>4 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1三
#>518.78360.01753.1534.44017.020302三
#>6 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1三
#>7 14.3 8 360.0 245 3.21 3.570 15.84 0 3 4三
#>8 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2不是三个
#>9 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2非三
#>1019.26167.6123 3.923.44018.30104非三

由(v0.2.1.9000)于2019-01-16创建

是的,它不会。当
时,请查看
case\u一节,如下所述,这个问题随着dplyr>0.7.0而消失,可能会接受其中一个答案,看起来现在可以了。如果您想将一个范围划分为几个间隔,则值得考虑在
剪切时使用
cut
而不是
case\u有一个
标签
参数,可以重命名生成的类别。当然,我熟悉
操作符,但对
剪切
重新编码
等不是必需的。@tomw我刚才是根据您发布的问题和Sumedh的(已删除的帖子)回答的,当
仍处于实验阶段时,
案例仍然处于实验阶段,因此在其他函数上正常工作的一些东西可能在这里不起作用。嗯?两者对我来说都很好。我无法想象解析器会遇到这样的问题(与基础计算器相反).
dplyr
0.7.0
将受益于一条错误消息,该消息指示此问题在
0.7.0
中得到解决,而不是
错误:未找到对象“carb”
。好的,我将尝试其他方法
mtcars %>%  
   mutate(cg = case_when(
      .$carb <= 2 ~ "low",  .$carb > 2 ~ "high")
      ) 
library(dplyr) # >= 0.7.0
mtcars %>% 
  mutate(cg = case_when(carb <= 2 ~ "low",
                        carb > 2  ~ "high"))
library(dplyr) #loading the dplyr package

content150_fortified <- content150 %>% #creating a new variable
mutate(number_yn = case_when( #creating a new column using mutate
        number >= 18 & number <=25 ~ "no", # if number is "none", make number_yn "no"
        number!="none" ~ "yes"  # if number is not "none", make number_yn "yes"
        )
      )