2015-03-31 60 views
4

我有一個腳本返回data.table,它將包含一組列。我想重新命名這些列中的一部分,但如果不是全部都存在,則setnames會中斷。有沒有什麼方法可以重新命名,而無需循環+錯誤捕捉或與現有名稱相交?當某些列名可能不存在時使用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 

類似setnames(..., allow=T)會是理想的。

編輯:將其歸類爲FR on Github

回答

1

另一種方法改編自arunsrinivasan的建議對Github FR

Setnames <- function(x, old, new, allow.absent.cols=F) { 
    if (!allow.absent.cols) { 
    setnames(x, old, new) 
    } else { 
    ix <- match(names(x), old, 0L) 
    setnames(x, old[ix], new[ix]) 
    } 
} 
2

這個修訂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) 
    } 
} 
2

你可以試試 「的一行」

library(data.table) 
iris.dt <- data.table(iris) 

setnames(iris.dt,c("Sepal.Length", "Sepal.Width")[names(iris.dt) %chin% c("Sepal.Length", "Sepal.Width")], c("length", "width")[names(iris.dt) %chin% c("Sepal.Length", "Sepal.Width")]) 

您可以使用oldnew作爲輸入變量。

相關問題