使用
data.table
,我想修改数据表对象x1
的列x2
、x3
和dt
。每个版本的代码都实现了修改,但在多个地方重复了对象和列名称。
如何减少这种重复?例如,是否有一种简单的方法来指示
.SDcols = cols_to_modify
应就地更新,而不将 cols_to_modify
添加到第二个参数的 LHS?
注意,我正在处理大数据,因此我必须使用
data.table
而不是 tidyverse
,因为前者要快得多。
library(data.table)
library(stringr)
dt <- data.table(A = c(1, 2, 3), B = c("apple", "pear", "banana"),
x1 = c(2, 4, 6), x2 = c(3, 6, 9), x3 = c(1, 2, 3))
# Version 1
cols_to_modify <- str_subset(names(dt), "^x[0-9]+$")
dt[, (cols_to_modify) := lapply(.SD, as.character), .SDcols = cols_to_modify]
# Version 2
dt[, (str_subset(names(dt), "^x[0-9]+$")) := lapply(.SD, as.character), .SDcols = cols_to_modify]
一个可能的替代方案:
convert_cols <- function(dt, cols, fun) {
for (col in cols) set(dt, j = col, value = fun(dt[[col]]))
}
convert_cols(dt, cols_to_modify, fun = as.character)