在mutate

时间:2018-02-22 11:12:01

标签: r dplyr

简而言之: 您可以在!!!内使用case_when拼接和mutate的列表输入,以及如何使用?

正如dplyr> 0.7.0中对previous question的回答中所述,您可以在case_when()

内的mutate()内使用裸变量名称

接下来,在case_when !!!中,它显示了如何使用模式列表和x <- 1:50 patterns <- list( TRUE ~ as.character(x), x %% 5 == 0 ~ "fizz", x %% 7 == 0 ~ "buzz", x %% 35 == 0 ~ "fizz buzz" ) case_when(!!! patterns) ,如下所示:(模式是错误的方式,一般情况下首先,但实际文档中就是这种情况,对我的问题无关紧要)

testframe <- tibble(y = 1:50) #Switching to y so the x from earlier can't interfere

testframe2 <- testframe %>% 
  mutate(
    fizzbuzz = case_when(
      y %% 35 == 0 ~ "fizz buzz",
      y %% 5 == 0 ~ "fizz",
      y %% 7 == 0 ~ "buzz",
      TRUE ~ as.character(y)
    )
  )

patterns <- list(
  y %% 35 == 0 ~ "fizz buzz",
  y %% 5 == 0 ~ "fizz",
  y %% 7 == 0 ~ "buzz",
  TRUE ~ as.character(y)
)

testframe3 <- testframe %>% 
  mutate(
    fizzbuzz = case_when(
      !!!(patterns)
    )
  )

然而,结合这些方法似乎不起作用:

Error in mutate_impl(.data, dots) : 
  Evaluation error: object 'y' not found.

testframe2可以正常工作,而testframe3会出现以下错误:

quo()

我假设这里有一些NSE魔法,但我没有设法quo()我的出路。我确实查看了testframe2和3的testframe2quo <- quo(testframe %>% mutate( fizzbuzz = case_when( y %% 35 == 0 ~ "fizz buzz", y %% 5 == 0 ~ "fizz", y %% 7 == 0 ~ "buzz", TRUE ~ as.character(y) ) ) ) testframe3quo <- quo(testframe %>% mutate( fizzbuzz = case_when( !!!(patterns) ) ) ) testframe2quo <quosure: global> ~testframe %>% mutate(fizzbuzz = case_when(y%%35 == 0 ~ "fizz buzz", y%%5 == 0 ~ "fizz", y%%7 == 0 ~ "buzz", TRUE ~ as.character(y))) testframe3quo <quosure: global> ~testframe %>% mutate(fizzbuzz = case_when(y%%35 == 0 ~ "fizz buzz", y%%5 == 0 ~ "fizz", y%%7 == 0 ~ "buzz", TRUE ~ as.character(y))) help file中建议的调试方法)。我注意到他们是一样的:

!!!

所有这些都让我回到了我的问题: 您可以在case_when内使用mutate拼接和import corner fig = corner.corner(samples, labels=["$m$", "$b$", "$\ln\,f$"]) fig.show() 的列表输入,以及如何使用?

1 个答案:

答案 0 :(得分:1)

您应该将案例包裹在exprs而不是list中并使用前缀.data

patterns <- rlang::exprs(
  .data$y %% 35 == 0 ~ "fizz buzz",
  .data$y %% 5 == 0 ~ "fizz",
  .data$y %% 7 == 0 ~ "buzz",
  TRUE ~ as.character(.data$y)
)

mutate(testframe, fizzbuzz = case_when(!!! patterns))