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

Extract Variable Names whose Values contain a specific string (R)

我想提取一个向量,其中包含所有变量的名称,这些变量的值(不是名称本身)包含特定字符串。

例如:

> 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"

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

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

否则,您可以使用 applyMARGIN = 2 将此函数应用于每一列和 return 命名逻辑向量:

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"

使用 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