基于 dplyr 中的向量创建新列

C. *_*aun 3 r dplyr

使用dplyr以下命令可以轻松创建新列mutate

df <- data.frame(v1 = 1:3, v2 = c('a','b','c'))
> mutate(df, newcol = NA)
  v1 v2 newcol
1  1  a     NA
2  2  b     NA
3  3  c     NA
Run Code Online (Sandbox Code Playgroud)

我们还可以使用向量创建多个新列mutate_at如下所示):

> cnames <- c('newcol1', 'newcol2', 'newcol3')
> mutate_at(df, cnames, funs(log(v1)))
  v1 v2   newcol1   newcol2   newcol3
1  1  a 0.0000000 0.0000000 0.0000000
2  2  b 0.6931472 0.6931472 0.6931472
3  3  c 1.0986123 1.0986123 1.0986123
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以使用 来将这些新列初始化为 NA dplyr

例如,mutate_at(df, cnames, funs(v1 * NA))给出了期望的结果,但这似乎是间接的。我想要的是:

mutate_at(df, cnames, funs(. = NA)) # Error: Can't create call to non-callable object
Run Code Online (Sandbox Code Playgroud)

我们不需要知道任何其他列的名称。

(我知道这可以简单地解决df[ , cnames] <- NA,但我正在寻找使用dplyr函数的解决方案)


编辑:

使用dplyr该示例的更高版本将变为:

mutate_at(df, all_of(cnames), funs(log(v1)))
Run Code Online (Sandbox Code Playgroud)

mar*_*kus 5

你可以这样做。

library(dplyr)
df %>% 
 `is.na<-`(cnames)
#  v1 v2 newcol1 newcol2 newcol3
#1  1  a      NA      NA      NA
#2  2  b      NA      NA      NA
#3  3  c      NA      NA      NA
Run Code Online (Sandbox Code Playgroud)

我希望一个%>%就够dplyr了。;)

  • @C.Braun您可能知道“magrittr”包为此类情况提供了一组别名,请参阅“?magrittr::add”。您可以定义自己的,以使管道更舒适,例如 `set_NA &lt;- \`is.na&lt;-\`; df %&gt;% set_NA(cnames)`. (2认同)