2017-09-06 67 views
0

嗨,我有下面的數據框。由於該列包含NA,因此該列的數據類型爲character。現在,我需要獲取只包含String值的列名和索引。如何獲得列名稱和列索引

在下面的例子中,我想列名和ZO-A的列索引和ZO-B:

ZONE-1  Zo-A   Zone-3  Zo-B 
58   On    75   NA 
60   NA    NA   High 
NA   Off   68   Low 
70   On    NA   NA 

到目前爲止,我想首先他們轉換爲數值,這創造不適用於Zo-A和Zo-B專欄。如果我用下面的代碼列索引,我越來越NA的結果

a <- which(colnames(df)=="Zo-A") 
integer(0) 

match_col <- match(c("Zo-A","Zo-B")names(df)) 
NA NA 

我需要下面的操作來進行:

  1. 我需要先得到它由Stringcolumn names
  2. 我需要column index爲同一
+0

破折號在colnames中是不允許的,所以它被轉換爲''',至少當我嘗試它時),試試:'which(colnames(df)==「Zo.A」)' – timfaber

+0

默認情況下,短跑。而我的實際欄目名稱很大,有很多破折號。而我在我的數據集中的列大約是100.所以將它們全部轉換爲'。'會很困難。 – Anagha

+0

沒有比這只是通過自己閱讀數據的問題,你可以分享一些輸入(dput)? – timfaber

回答

1

對於我明白你的問題,你想要什麼,或者需要進行了重新盟友,真的很簡單。

首先,在讀取數據。

df <- read.table(text = " 
ZONE-1  Zo-A   Zone-3  Zo-B 
58   On    75   NA 
60   NA    NA   High 
NA   Off   68   Low 
70   On    NA   NA 
", header = TRUE, check.names = FALSE) 

str(df) 
'data.frame': 4 obs. of 4 variables: 
$ ZONE-1: int 58 60 NA 70 
$ Zo-A : Factor w/ 2 levels "Off","On": 2 NA 1 2 
$ Zone-3: int 75 NA 68 NA 
$ Zo-B : Factor w/ 2 levels "High","Low": NA 1 2 NA 

df 
    ZONE-1 Zo-A Zone-3 Zo-B 
1  58 On  75 <NA> 
2  60 <NA>  NA High 
3  NA Off  68 Low 
4  70 On  NA <NA> 

現在,問題(1), 「先把它由字符串值的列名」。所有列名都由字符串值組成,因此可以使用namescolnames完成。

names(df) 
[1] "ZONE-1" "Zo-A" "Zone-3" "Zo-B" 

colnames(df) 
[1] "ZONE-1" "Zo-A" "Zone-3" "Zo-B" 

現在問題(2),以獲得「相同」的列索引。 (我想這是列Zo-A你所要求的。)

a <- which(colnames(df) == "Zo-A") 
a 
[1] 2 

a2 <- grep("Zo-A", colnames(df)) 
a2 
[1] 2 

數據在dput格式。

df <- 
structure(list(`ZONE-1` = c(58L, 60L, NA, 70L), `Zo-A` = structure(c(2L, 
NA, 1L, 2L), .Label = c("Off", "On"), class = "factor"), `Zone-3` = c(75L, 
NA, 68L, NA), `Zo-B` = structure(c(NA, 1L, 2L, NA), .Label = c("High", 
"Low"), class = "factor")), .Names = c("ZONE-1", "Zo-A", "Zone-3", 
"Zo-B"), class = "data.frame", row.names = c(NA, -4L)) 

編輯
如果你只需要得到的字母和標點符號組成的列名,你可以使用下面的正則表達式。

a3 <- grep("^[[:alpha:]|[:punct:]]*$", colnames(df)) 
a3 
[1] 2 4 
+0

謝謝。但是,這種方法不適合我的情況。 ** 1。**我正在使用read.csv ** 2讀取文件。** **我只需要那些由「on」,「off」等值組成的列名稱。包括數值在內的列** ** ** ** ** ** ** ** ** * * * * * * * *我總共有100列,其中大約50列包含像「開」,「關」等值。因此難以跟隨上面的方法來找到列名 – Anagha

+0

@Anagha如果你只需要列名,也許你應該嘗試用'readLines'來讀取它們。設置參數'n = 1',它將最多讀取一行,這是列標題應該是的第一行。如果這樣做,你會得到這些名字的字符矢量,不需要額外的工作。然後使用'which'或'grep'來獲得你想要的列的索引。 –

+0

不,readLines沒有給出我需要的結果。更喜歡,read.csv – Anagha

0

爲了得到這一點,我們可以使用下面的代碼:

K=sapply(df,function(x)any(grepl("\\D+",x))) 
names (df)[K] 
    Zo.A Zo.B 

Which (k) 
    Zo.A Zo.B 
    2 4 
+0

我需要先找出列名,然後索引。正如我前面提到的,我的實際數據集包含大約100列,其中少數列具有alpha值。因此,我需要首先得到這個 – Anagha

0

在閱讀data.frame你可以指定「stringsAsFactors = FALSE」,如果你的數據本身包含NA作爲一個字符串「NA 「那麼,你可以指定在read.csv設置此參數na.strings = C(」 NA「)

df = read.csv('file.csv',header=T,stringsAsFactors=FALSE,na.strings=c("NA")) 

然後嘗試:

type = sapply(df,class) 
indexes = which(type=='character') 
nameofindexes = names(indexes) 
+0

爲什麼這是downvoted? – TUSHAr