我正在寻找简化代码的简单方法。
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
将返回错误:
Error in function_list[[k]](value) : could not find function ".data"
与使用.
的语法相同。我的问题是:语法方面,我如何获得与sqrt
函数相同的效果,但将更长的函数应用于传递的子集?
答案 0 :(得分:3)
怎么样?
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][]