Say we have the following data frame:
> df A B C 1 1 2 3 2 4 5 6 3 7 8 9 We can select column 'B' from its index:
> df[,2] [1] 2 5 8 Is there a way to get the index (2) from the column label ('B')?
Say we have the following data frame:
> df A B C 1 1 2 3 2 4 5 6 3 7 8 9 We can select column 'B' from its index:
> df[,2] [1] 2 5 8 Is there a way to get the index (2) from the column label ('B')?
you can get the index via grep and colnames:
grep("B", colnames(df)) [1] 2 or use
grep("^B$", colnames(df)) [1] 2 to only get the columns called "B" without those who contain a B e.g. "ABC".
grep the way you describe it.The following will do it:
which(colnames(df)=="B") grep is also the advantage, namely that it uses regular expressions (so you can search for any pattern in your colnames). To just get the colnames "B" use "^B$" as the pattern in grep. ^ is the metacharacter for the beginning and $ for the end of a string.which. You can directly use df[names(df)=="B"]grep("^fBodyAcc-meanFreq\\()-Z$",colnames(df)) or also grep("^fBodyAcc-meanFreq\\(\\)-Z$",colnames(df)).I wanted to see all the indices for the colnames because I needed to do a complicated column rearrangement, so I printed the colnames as a dataframe. The rownames are the indices.
as.data.frame(colnames(df)) 1 A 2 B 3 C cbind(names(df)).t(t(names(df))) saves you 2 characters ;)Following on from chimeric's answer above:
To get ALL the column indices in the df, so i used:
which(!names(df)%in%c()) or store in a list:
indexLst<-which(!names(df)%in%c()) This seems to be an efficient way to list vars with column number:
cbind(names(df)) Output:
[,1] [1,] "A" [2,] "B" [3,] "C" Sometimes I like to copy variables with position into my code so I use this function:
varnums<- function(x) {w=as.data.frame(c(1:length(colnames(x))), paste0('# ',colnames(x))) names(w)= c("# Var/Pos") w} varnums(df) Output:
# Var/Pos # A 1 # B 2 # C 3 Here is an answer that will generalize Henrik's answer.
df=data.frame(A=rnorm(100), B=rnorm(100), C=rnorm(100)) numeric_columns<-c('A', 'B', 'C') numeric_index<-sapply(1:length(numeric_columns), function(i) grep(numeric_columns[i], colnames(df))) sapply is a long way to write match(numeric_columns, names(df)) --- unless you really need the regex power rather than exact string matching.#I wanted the column index instead of the column name. This line of code worked for me:
which (data.frame (colnames (datE)) == colnames (datE[c(1:15)]), arr.ind = T)[,1] #with datE being a regular dataframe with 15 columns (variables) data.frame(colnames(datE)) #> colnames.datE. #> 1 Ce #> 2 Eu #> 3 La #> 4 Pr #> 5 Nd #> 6 Sm #> 7 Gd #> 8 Tb #> 9 Dy #> 10 Ho #> 11 Er #> 12 Y #> 13 Tm #> 14 Yb #> 15 Lu which(data.frame(colnames(datE))==colnames(datE[c(1:15)]),arr.ind=T)[,1] #> [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15