Извлечь имена переменных, значения которых содержат определенную строку (R) - PullRequest
0 голосов
/ 04 октября 2018

Я хочу извлечь вектор, содержащий имена всех переменных, значения которых (не сами имена) содержат конкретную строку.

Например:

> 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 голосов
/ 04 октября 2018

С тидиверсом:

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
0 голосов
/ 04 октября 2018

Если каждое значение в Mark1 и Mark2 содержит %, мы можем проверить только первую строку:

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

В противном случае вы можете использовать apply с MARGIN = 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"
...