首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取列名和列索引

如何获取列名和列索引
EN

Stack Overflow用户
提问于 2017-09-06 07:26:24
回答 3查看 23.5K关注 0票数 1

嗨,我有下面的资料。由于列包含NA,所以该列的数据类型为character。现在,我需要得到列名和索引,它只包含字符串值。

在下面的示例中,我希望获得Zo和Zo的列名和列索引:

代码语言:javascript
复制
 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和Zo列创建了NA。如果我将下面的代码用于列索引,则得到NA作为结果。

代码语言:javascript
复制
a <- which(colnames(df)=="Zo-A" )
integer(0)

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

我需要执行以下操作:

  1. 我需要首先得到由column names值组成的String
  2. 我需要同样的column index
EN

回答 3

Stack Overflow用户

发布于 2017-09-06 08:10:29

对于我对你的问题的理解,你想要或需要的是非常非常简单的。

首先,读取数据。

代码语言:javascript
复制
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来完成。

代码语言:javascript
复制
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栏。)

代码语言:javascript
复制
a <- which(colnames(df) == "Zo-A")
a
[1] 2

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

dput格式的数据.

代码语言:javascript
复制
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))

编辑

如果只需要获得由字母字符和标点符号组成的列名,则可以使用以下正则表达式。

代码语言:javascript
复制
a3 <- grep("^[[:alpha:]|[:punct:]]*$", colnames(df))
a3
[1] 2 4
票数 4
EN

Stack Overflow用户

发布于 2017-09-06 09:32:42

要获得这个结果,我们可以使用下面的代码:

代码语言:javascript
复制
K=sapply(df,function(x)any(grepl("\\D+",x)))
 names (df)[K]
    Zo.A Zo.B 

 Which (k)
   Zo.A Zo.B 
     2    4 
票数 1
EN

Stack Overflow用户

发布于 2017-09-06 09:49:51

在读取data.frame时,可以指定'stringsAsFactors=FALSE‘,如果数据本身包含NA作为字符串"NA“,则可以在read.csv中指定此参数na.strings = c("NA")。

代码语言:javascript
复制
df = read.csv('file.csv',header=T,stringsAsFactors=FALSE,na.strings=c("NA"))

然后试着:

代码语言:javascript
复制
type = sapply(df,class) 
indexes = which(type=='character')
nameofindexes = names(indexes)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46069227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档