【问题标题】:Extract Variable Names whose Values contain a specific string (R)提取其值包含特定字符串 (R) 的变量名称
【发布时间】:2018-10-04 14:43:04
【问题描述】:

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

例如:

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

【问题讨论】:

  • names(dat)[,sapply(dat,function(x)any(grepl("%", x))]

标签: r variable-names


【解决方案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"

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-28
      • 1970-01-01
      • 2011-11-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多