2012-03-05 43 views
2

我有一個數據框的列按字母順序排列(COL_A,COL_B,COL_C等)。我怎樣才能將列H到M進行子集劃分,而不必明確地寫出列名,或者不計算有多少列?如何從數據框中按子列排列一些按字母順序排列的列?

編輯澄清:我不是故意說這些列完全是COL_A,COL_B等,只是它們按名稱字符串中的任何常見結構按字母順序排列。例如,他們可以是阿拉巴馬州,阿肯色州,德克薩斯州,懷俄明州和贊比亞。簡而言之,我試圖找到df_subset = df[,n1:n2]的替代方案,我可以直接輸入列名稱,而不必計算列號n1和n2。

回答

3

更常用的方法是使用應用於列名的>=<=運算符。下面是使用的數據幀的示例,其中列名US規定:

> df <- data.frame(as.list(state.abb)) 
> colnames(df) <- state.name 
> df[, 1:3] 
    Alabama Alaska Arizona 
1  AL  AK  AZ 
> df[colnames(df) >= "Florida" & colnames(df) <= "Illinois"] 
    Florida Georgia Hawaii Idaho Illinois 
1  FL  GA  HI ID  IL 

另一種方法是使用match找到兩個邊界的索引,並建立這兩個之間的序列:

> df[seq(from = match("Florida", colnames(df)), 
+  to = match("Illinois", colnames(df)))] 
    Florida Georgia Hawaii Idaho Illinois 
1  FL  GA  HI ID  IL 
+0

我實際上試圖找到df [,n1:n2]的字母/字符串版本,即我想避免計算實際的列數。你的第二個選擇是完美的。非常感謝,flodel。 – user702432 2012-03-07 03:29:40

3
d = as.data.frame(matrix(1:26,nrow=1)) 
names(d) = paste("COL_", LETTERS, sep="") 
grep("[H-M]$", names(d)) 
d[, grepl("[H-M]$", names(d))] 
+0

(+1)簡單而高效! – chl 2012-03-05 11:17:49

+1

使用'patt =「^ COL_ [H-M] $」'會不會更安全? – 2012-03-05 13:27:51

+0

@DWin可能,但問題是模式上有點模糊匹配 – baptiste 2012-03-05 18:41:01

1

你可以嘗試這樣的事情

dfrm <- data.frame(replicate(26, rnorm(10))) 
colnames(dfrm) <- paste("COL", LETTERS, sep="_") 
which(substr(colnames(dfrm), 5, 6) %in% LETTERS[3:6]) 

最後一個表達式返回匹配字母C至F也見match,這相關的線程列數:Get column index from label in a data frame