2012-02-14 42 views
40

thể trùng lặp:
Get column index from label in a data frameNhận số lượng cột trong R được đặt tên cột

tôi cần phải nhận được số cột của một cột được đặt tên.

Giả sử chúng ta có dataframe sau:

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

Tôi cần một chức năng mà sẽ làm việc như sau:

getColumnNumber(df,"b") 

Và nó sẽ trở

[1] 2 

Có có chức năng như thế không?

Cảm ơn!

Trả lời

71
which(colnames(df)=="b") 

Nên làm điều đó.

53

Một phương pháp nhanh chóng và gọn gàng là:

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

Đó tránh vector quét mà ==which làm. Nếu bạn có nhiều cột, và bạn làm điều này rất nhiều, thì bạn có thể thích fastmatch package.

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

fmatch nhanh hơn match, nhưng các cuộc gọi tiếp theo nó không chỉ nhanh hơn, nó ngay lập tức.

+1

Nếu Tôi đang sử dụng chỉ là một biến (một cột), "phù hợp" và "mà" cả hai đều làm việc như nhau cho tôi. Tuy nhiên, nếu tôi đang sử dụng nhiều hơn một biến, "mà" ném lỗi, trong khi "trận đấu" không cho tôi lỗi. Vì vậy, đối với tình hình của tôi, "trận đấu" là một sự lựa chọn vượt trội. Cảm ơn! –

9

Một phương pháp mà khái quát tốt hơn nhiệm vụ phù hợp không chính xác là sử dụng grep:

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

Nếu bạn muốn số lượng tất cả các tên cột đó bắt đầu bằng "b" để được gỡ bỏ, bạn sẽ viết :

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

Làm gọn gàng vấn đề bạn không thể sử dụng lập chỉ mục phủ định với vectơ ký tự.

7

..especially, nếu bạn cần để có được một vài chỉ số cột phương pháp dưới đây được áp dụng:

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

nếu bạn sử dụng này cho Subsetting df bạn không cần phải có()

> 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 
Các vấn đề liên quan