使用 magrittr 反向管道编写非标准评估语法
Writing non-standard evaluation syntax with use of magrittr reverse pipe
我正在寻找简化代码的简单方法。
例子
sqrt
函数可以轻松应用于下面的列子集。
require(magrittr)
mtcars[,-which(colnames(mtcars) %in%
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))] %<>%
sqrt
问题
我有兴趣将其他转换应用于子集 ,而无需 再次键入整个子集序列。
例如代码:
mtcars[,-which(colnames(mtcars) %in%
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))] %<>%
.data * 1000
会return错误:
Error in function_list[[k]](value) : could not find function ".data"
与使用 .
的语法相同。我的问题是:在语法方面,如何获得与 sqrt
函数相同的效果,但将更长的函数应用于传递的子集?
怎么样?
sel_cols <- setdiff(colnames(mtcars),
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))
mtcars[, sel_cols] %<>% {sqrt(.) %>% `*`(1000)}
还是data.table
方法?
library(data.table)
sel_cols <- setdiff(colnames(mtcars),
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))
dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, sqrt), .SDcols = sel_cols][]
并结合管道:
dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, function(x) {sqrt(x) %>% `*`(1000)}), .SDcols = sel_cols][]
我正在寻找简化代码的简单方法。
例子
sqrt
函数可以轻松应用于下面的列子集。
require(magrittr)
mtcars[,-which(colnames(mtcars) %in%
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))] %<>%
sqrt
问题
我有兴趣将其他转换应用于子集 ,而无需 再次键入整个子集序列。
例如代码:
mtcars[,-which(colnames(mtcars) %in%
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))] %<>%
.data * 1000
会return错误:
Error in function_list[[k]](value) : could not find function ".data"
与使用 .
的语法相同。我的问题是:在语法方面,如何获得与 sqrt
函数相同的效果,但将更长的函数应用于传递的子集?
怎么样?
sel_cols <- setdiff(colnames(mtcars),
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))
mtcars[, sel_cols] %<>% {sqrt(.) %>% `*`(1000)}
还是data.table
方法?
library(data.table)
sel_cols <- setdiff(colnames(mtcars),
c("mpg", "cyl", "drat", "wt", "carb",
"hp", "qsec", "vs", "am", "gear"))
dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, sqrt), .SDcols = sel_cols][]
并结合管道:
dt <- as.data.table(mtcars)
dt[, (sel_cols) := lapply(.SD, function(x) {sqrt(x) %>% `*`(1000)}), .SDcols = sel_cols][]