2012-03-05 42 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