提取其值包含特定字符串(R)的变量名称

时间:2018-10-04 14:43:05

标签: r variable-names

我想提取一个包含所有变量名称(其值(而非名称本身)包含特定字符串)的向量。

例如:

> dat
  Name Mark1 Mark2 Mark3
1    A   67%   61%    87
2    B   98%   83%    26
3    C   42%   62%    98
4    D   83%   32%    36
5    E   40%   90%    80
6    F   89%   25%    44

从上面的数据框中,我想要变量名称,其值包含'%'符号。到目前为止,我一直在使用for循环来执行此操作,但这似乎是完成简单任务的漫长路途。

> prct <- c()
> for (i in 1:ncol(dat)){
    if (any(grepl("%", dat[,i]) == T)){
      prct <- c(prct, colnames(dat)[i])
    }
  }
> prct
[1] "Mark1" "Mark2"

2 个答案:

答案 0 :(得分:1)

如果Mark1Mark2中的每个值都包含一个%,我们只能检查第一行:

colnames(df)[grepl('%', df[1,])]
[1] "Mark1" "Mark2"

否则,可以将applyMARGIN = 2一起使用,以将此函数应用于每一列并返回一个命名的逻辑向量:

apply(df, 2, function(x) any(grepl('%', x)))
 Name Mark1 Mark2 Mark3 
FALSE  TRUE  TRUE FALSE

如果只需要变量名,请使用此逻辑向量作为colnames(df)的子集:

colnames(df)[apply(df, 2, function(x) any(grepl('%', x)))]
[1] "Mark1" "Mark2"

答案 1 :(得分:0)

使用tidyverse:

df<-read.table(text=
"  Name Mark1 Mark2 Mark3
1    A   67%   61%    87
2    B   98%   83%    26
3    C   42%   62%    98
4    D   83%   32%    36
5    E   40%   90%    80
6    F   89%   25%    44",h=TRUE)

f <- function(x) any(str_detect(x,"%"))
df %>% select_if(f) %>% colnames

#[1] "Mark1" "Mark2"

或者:

df %>% select_if(funs(any(str_detect(.,"%")))) %>% colnames