当某些列名可能不存在时,使用data.table :: setnames()

Max*_*nis 5 r data.table

我有一个脚本返回一个data.table将包含一组列的脚本。我想重命名其中的一些列,但是setnames如果没有全部出现,则会中断。有什么方法可以重命名而不会引起循环+错误捕获或与现有名称相交?

iris.dt <- data.table(iris)
# First time works fine
setnames(iris.dt, c("Sepal.Length", "Sepal.Width"), c("length", "width"))
# Second time fails because columns no longer exist
setnames(iris.dt, c("Sepal.Length", "Sepal.Width"), c("length", "width"))
# Error in setnames(iris.dt, c("Sepal.Length", "Sepal.Width"), c("length",
# :Items of 'old' not found in column names: Sepal.Length,Sepal.Width
Run Code Online (Sandbox Code Playgroud)

这样的东西setnames(..., allow=T)将是理想的。

编辑:将其作为FR归档在Github上

rou*_*off 7

data.tablev1.12.0(2019 年 1 月 13 日)开始,这是一个参数setnames

setnames(..., skip_absent=TRUE)  # FALSE by default.
Run Code Online (Sandbox Code Playgroud)


Max*_*nis 5

这个修改后的setnames函数成功了:

Setnames <- function(x, old, new, allow.absent.cols=F) {
  if (!allow.absent.cols) {
    setnames(x, old, new)
  } else {
    old.intersect <- intersect(old, names(x))
    common.indices <- old %in% old.intersect
    new.intersect <- new[common.indices]
    setnames(x, old.intersect, new.intersect)
  }
}
Run Code Online (Sandbox Code Playgroud)