2012-11-13 91 views
4

如何在R中使用子集函數時忽略大小寫?如何在R中使用子集時忽略大小寫

eos91corr.data <- subset(test.data,select=c(c(X,Y,Z,W,T))) 

我想選擇名稱爲x,y,z,w,t的列。我該怎麼辦?

感謝

+0

你的意思是你想找到的名字'X,X,Y,Y,Z,Z,...'?否則,爲什麼你要指定大寫? –

回答

4

如果你能活着沒有subset()功能,tolower()功能可能工作:

dat <- data.frame(XY = 1:5, x = 1:5, mm = 1:5, 
    y = 1:5, z = 1:5, w = 1:5, t = 1:5, r = 1:5) 
dat[,tolower(names(dat)) %in% c("xy","x")] 

然而,這將返回與列的data.frame在爲了他們在原始數據集dat:既

dat[,tolower(names(dat)) %in% c("xy","x")] 

dat[,tolower(names(dat)) %in% c("x","xy")] 

將產生相同的結果,儘管目標名稱的順序已被顛倒。

如果希望結果中的列按照目標向量的順序排列,則需要稍微多一些。

dat[,sapply(c("x","xy"),FUN=function(foo)which(foo==tolower(names(dat))))] 
dat[,sapply(c("xy","x"),FUN=function(foo)which(foo==tolower(names(dat))))] 
+0

這工作正常。我遇到了另一個問題:如何按照我的要求保留訂單?在%c(「x」,「xy」)]中表示dat [,tolower(names(dat))%。我想保留列順序xy,x。我該怎麼做?謝謝。 – Autumn

+0

@林:我編輯我的答案,以反映你的新問題和可能的方式來做到這一點。希望這可以幫助! –

+1

斯蒂芬,你真是個高手!非常感謝! – Autumn

2

你可以使用正則表達式的grep功能識別列名時選擇忽略大小寫。一旦你確定了所需的列名,那麼你可以將它們傳遞給subset

如果你的數據是

dat <- data.frame(xy = 1:5, x = 1:5, mm = 1:5, y = 1:5, z = 1:5, 
    w = 1:5, t = 1:5, r = 1:5) 
# xy x mm y z w t r 
# 1 1 1 1 1 1 1 1 1 
# 2 2 2 2 2 2 2 2 2 
# 3 3 3 3 3 3 3 3 3 
# 4 4 4 4 4 4 4 4 4 
# 5 5 5 5 5 5 5 5 5 

然後

(selNames <- grep("^[XYZWT]$", names(dat), ignore.case = TRUE, value = TRUE)) 
# [1] "x" "y" "z" "w" "t" 

subset(dat, select = selNames) 
# x y z w t 
# 1 1 1 1 1 1 
# 2 2 2 2 2 2 
# 3 3 3 3 3 3 
# 4 4 4 4 4 4 
# 5 5 5 5 5 5 

編輯如果你的列名長於一個字母,上述方法將無法正常使用。因此,假如你可以得到你想要的列名在一個載體,可以使用下列內容:

upperNames <- c("XY", "Y", "Z", "W", "T") 

(grepPattern <- paste0("^", upperNames, "$", collapse = "|")) 
# [1] "^XY$|^Y$|^Z$|^W$|^T$" 
(selNames2 <- grep(grepPattern, names(dat), ignore.case = TRUE, value = TRUE)) 
# [1] "xy" "y" "z" "w" "t" 
subset(dat, select = selNames2) 
# xy y z w t 
# 1 1 1 1 1 1 
# 2 2 2 2 2 2 
# 3 3 3 3 3 3 
# 4 4 4 4 4 4 
# 5 5 5 5 5 5 
+0

這是如此整潔,樂於助人!非常感謝! – Autumn

0

在「stringr」庫是一個非常整潔的包裝:以下兩個命令都在目標矢量的順序(即,結果將是不同的,具有列交換)返回一個data.frame與列所有這些功能。它具有 'ignore.case' 選項,如下所示:

 also, you may want to consider using match not subset.