data.table中get(columnname)与[[columnname]]的列访问用法对比问询
嘿,在使用data.table时,如果你需要通过变量传入的列名来访问或修改列,最常用的有两种方法,我给你详细拆解下:
方法1:使用get()函数
get()函数能帮你在data.table的括号环境里,把变量对应的列名解析成实际的列。比如下面这个函数,专门用来把指定列转成数值类型:
cast_num_get <- function(inpDT, cols2cast){ for (thisCol in cols2cast){ inpDT[, (thisCol):=as.numeric(get(thisCol))] } return(inpDT); }
这里要注意(thisCol)的写法——加括号是告诉data-table:我们要把变量thisCol的值作为列名,而不是直接用字符串"thisCol"当列名,这点很关键。
方法2:使用[[索引
这是更贴近R基础语法的方式,直接用列表索引逻辑访问data.table的列,操作起来直观易懂:
cast_num_b <- function(inpDT, cols2cast){ for (thisCol in cols2cast){ # 注:原示例只是复制列值,实际做类型转换的话改成下面这句 # inpDT[[thisCol]] <- as.numeric(inpDT[[thisCol]]) inpDT[[thisCol]] <- inpDT[[thisCol]] } return(inpDT); }
这种方式不需要依赖data.table的特殊语法,和你操作普通列表的逻辑完全一致,新手更容易上手。
额外补充的两种实用方法
除了上面两种,还有两个方法也能实现类似需求:
- 用
.SDcols结合lapply(推荐):这是更符合data.table向量化风格的写法,避免循环,效率更高:
cast_num_sd <- function(inpDT, cols2cast){ inpDT[, (cols2cast) := lapply(.SD, as.numeric), .SDcols = cols2cast] return(inpDT) }
.SD代表Subset of Data,.SDcols用来指定我们要操作的列,用lapply批量处理列类型,简洁又高效。
- 用
eval(parse())(不推荐):这种方法通过解析字符串来执行代码,可读性差还存在安全风险,一般不建议使用,但可以了解下:
cast_num_eval <- function(inpDT, cols2cast){ for (thisCol in cols2cast){ inpDT[, eval(parse(text = paste0(thisCol, " := as.numeric(", thisCol, ")")))] } return(inpDT) }
内容的提问来源于stack exchange,提问作者Vasily A
相关产品推荐
相关产品推荐

