如何从数据帧中对一些按字母顺序排列的列进行子集化?

时间:2012-03-05 10:01:48

标签: r

我有一个数据框,其中列按字母顺序排列(COL_A,COL_B,COL_C等)。如何在不明确写出列名的情况下,将列H从H列为M,或者不计算列数?

编辑以澄清:我并不是说列完全是COL_A,COL_B等等,只是说它们按字母顺序排列在名称字符串中的任何常见结构中。例如,它们可以是阿拉巴马州,阿肯色州,德克萨斯州,怀俄明州和赞比亚。简而言之,我正在尝试找到df_subset = df[,n1:n2]的替代方法,我可以直接输入列名,而不必计算列号n1和n2。

3 个答案:

答案 0 :(得分: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))]

答案 1 :(得分:3)

更通用的方法是使用应用于列名称的>=<=运算符。以下是使用数据框的示例,其中列名称为美国州:

> 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

答案 2 :(得分: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