Obțineți numărul coloanei în R, având în vedere numele coloanei [duplicate] (Programare, R)

João Daniel a intrebat.

Posibil duplicat:
Obțineți indicele coloanei din eticheta unui cadru de date

Am nevoie să obțin numărul coloanei unei coloane dat fiind numele acesteia.

Să presupunem că avem următorul cadru de date:

df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))

Am nevoie de o funcție care să funcționeze în felul următor:

getColumnNumber(df,"b")

Și care să returneze

[1] 2

Există o astfel de funcție?

Mulțumesc!

4 răspunsuri
Ari B. Friedman
which( colnames(df)=="b" )

Ar trebui să o faceți.

Matt Dowle

O metodă rapidă și curată este :

> match("b",names(df))
[1] 2

Asta evită scanarea vectorului care == și which face. Dacă aveți o mulțime de coloane și faceți acest lucru foarte des, atunci s-ar putea să vă placă metoda pachetul fastmatch.

> require(fastmatch)
> fmatch("b",names(df))
[1] 2

fmatch este mai rapid decât match, dar la apelurile ulterioare nu este doar mai rapid, ci și instantaneu.

Comentarii

  • Dacă folosesc doar o singură variabilă (o singură coloană), „match” și „which” funcționează la fel de bine pentru mine. Cu toate acestea, dacă folosesc mai mult de o variabilă, „which” aruncă erori, în timp ce „match” nu îmi dă erori. Deci, pentru situația mea, „match” este o alegere superioară. Vă mulțumim! –  > Por jeramy townsley.
IRTFM

O altă metodă care se generalizează mai bine la sarcinile de potrivire neexactă este utilizarea grep:

grep("^b$", colnames(df) )

Dacă ați dori să eliminați numărul tuturor numelor de coloane care încep cu „b”, ați scrie:

df[ , - grep("^b", colnames(df) )]

Acest lucru rezolvă în mod clar problema că nu se poate utiliza indexarea negativă cu vectori de caractere.

Kay

…în special, dacă aveți nevoie să obțineți mai mulți indici de coloană se aplică abordarea de mai jos:

> df <- data.frame(a=rnorm(100),b=rnorm(100),c=rnorm(100))
> which(names(df)%in%c("b", "c"))
[1] 2 3

dacă folosiți acest lucru pentru subsetting df nu aveți nevoie de which()

> df_sub <- df[, names(df)%in%c("b", "c")]
> head(df_sub)
           b          c
1  0.1712754  0.3119079
2 -1.3656995  0.7111664
3 -0.2176488  0.7714348
4 -0.6599826 -0.3528118
5  0.4510227 -1.6438053
6  0.2451216  2.5305453

Tags: