我有一个数据框,其中列按字母顺序排列(COL_A,COL_B,COL_C等)。如何在不明确写出列名的情况下,将列H从H列为M,或者不计算列数?
编辑以澄清:我并不是说列完全是COL_A,COL_B等等,只是说它们按字母顺序排列在名称字符串中的任何常见结构中。例如,它们可以是阿拉巴马州,阿肯色州,德克萨斯州,怀俄明州和赞比亚。简而言之,我正在尝试找到df_subset = df[,n1:n2]
的替代方法,我可以直接输入列名,而不必计算列号n1和n2。
答案 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。