Отримати індекс стовпця від мітки у фреймі даних


79

Скажімо, у нас є такий фрейм даних:

> df
  A B C
1 1 2 3
2 4 5 6
3 7 8 9

Ми можемо вибрати стовпець 'B' з його індексу:

> df[,2]
[1] 2 5 8

Чи є спосіб отримати індекс (2) з мітки стовпця ('B')?


2
Дивіться відповідь @ matthewdowle тут для кращого рішення: stackoverflow.com/a/9277935/636656
Арі Б. Фрідман

Відповіді:


109

Ви можете отримати індекс через grepі colnames:

grep("B", colnames(df))
[1] 2

або використовувати

grep("^B$", colnames(df))
[1] 2

отримати лише стовпці з назвою "B" без тих, хто містить B, наприклад "ABC".


1
Переваги вашого оригінального прикладу можна продемонструвати в коді, якщо ви показали його використання у чомусь на зразок df [, grep ("^ B", colnames (df))], тобто повернення стовпців фрейму даних, що починаються з "B". Не соромтеся використовувати для подальшого редагування, якщо ви згодні.
IRTFM

2
Або навіть df [, grep ("^ [BC]", colnames (df))]], тобто стовпці, які починаються з B або C.
IRTFM

@Dwin: Як вже говорив @aix, запитувач хоче індекс . Але я також зазвичай використовую grepте, як ви це описуєте.
Генрік

@ Генрік. Дуже дякую. Це повинна бути найкорисніша команда для роботи з dplyr та змінними!
user989762

86

Це зробить наступне:

which(colnames(df)=="B")

2
Проблема grepтакож полягає в перевазі, а саме в тому, що вона використовує регулярні вирази (тому ви можете шукати будь-який шаблон у своїх іменах col). Щоб просто отримати назви col "B", використовуйте "^B$"як шаблон у grep. ^ - це метасимвол для початку та $ для кінця рядка.
Генрік

9
Вам навіть не потрібно which. Ви можете безпосередньо використовуватиdf[names(df)=="B"]
nico

4
@nico Питання в тому, щоб отримати індекс стовпця.
NPE

У кожному випадку у мене спрацьовувало "яке". Я не зміг отримати стовпець з назвою "fBodyAcc-meanFreq () - Z", використовуючи grep.
Панос Кал.

1
@Kabamaru: Греп працюватиме доти, доки ти втечеш від метасимволів. Для прикладу, який ви дали, це спрацює: grep("^fBodyAcc-meanFreq\\()-Z$",colnames(df))або також grep("^fBodyAcc-meanFreq\\(\\)-Z$",colnames(df)).
Стів

7

Я хотів побачити всі індекси для імен col, оскільки мені потрібно було зробити складну перестановку стовпців , тому я надрукував colnames як фрейм даних. Назви рядків - це індекси.

as.data.frame(colnames(df))

1 A
2 B
3 C

1
Більш стислий спосіб це зробити cbind(names(df)).
lillemets

6

Виходячи з химерних вище:

Щоб отримати ВСІ індекси стовпців у df , я використовував:

which(!names(df)%in%c()) 

або зберігати у списку:

indexLst<-which(!names(df)%in%c())

1
я думаю, що це найкраща відповідь, оскільки її можна узагальнити
Димитріос Захаратос,

2

Це, здається, ефективний спосіб перерахувати вари з номером стовпця:

cbind(names(df)) 

Вихід:

     [,1]
[1,] "A" 
[2,] "B" 
[3,] "C" 

Іноді мені подобається копіювати змінні з позицією у свій код, тому я використовую цю функцію:

varnums<- function(x) {w=as.data.frame(c(1:length(colnames(x))),
          paste0('# ',colnames(x)))
names(w)= c("# Var/Pos")
w}
varnums(df)

Вихід:

# Var/Pos
# A         1
# B         2
# C         3


0

Використовуйте tфункцію:

t(colnames(df))

     [,1]   [,2]   [,3]   [,4]   [,5]   [,6]  
[1,] "var1" "var2" "var3" "var4" "var5" "var6"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.