1

我正在寻找简化代码的简单方法。

例子

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但将更长的函数应用于传递的子集?

4

1 回答 1

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][]
于 2016-07-12T16:16:55.667 回答