Как найти имена столбцов на основе элемента столбца в r

#r

#r

Вопрос:

У меня есть следующий фрейм данных:

 1    2     3    4     5     6
P1 ca100  P4  cb100  P7   cc100
P2 ca075  P5  cb075  P8   cc075
P3 ca050  P6  cb050  P9   cc050
  

Я хочу найти имена столбцов, которые содержат определенный элемент. Например, если я хочу найти имя столбца, содержащее P1, вывод должен быть равен 1, имя столбца для любого элемента с «ca», «cb», «cc» должно быть 2, 4 и 6 соответственно.

Любая помощь будет оценена. Спасибо

Ответ №1:

Вы можете завершить str_detect stringr таким образом.

 colnames_given_pattern <- function(.data, pattern){
                
  suppressWarnings(names(.data)[stringr::str_detect(.data, pattern)])
                
}
        
colnames_given_pattern(df, "P1")
#> [1] "1"
colnames_given_pattern(df, "ca")
#> [1] "2"
colnames_given_pattern(df, "ca|cb")
#> [1] "2" "4"
colnames_given_pattern(df, "ca|cb|cc")
#> [1] "2" "4" "6"
  

Где df :

 df <- read.table(text="
P1 ca100  P4  cb100  P7   cc100
P2 ca075  P5  cb075  P8   cc075
P3 ca050  P6  cb050  P9   cc050",header=FALSE)
names(df) <- 1:6
df
#>    1     2  3     4  5     6
#> 1 P1 ca100 P4 cb100 P7 cc100
#> 2 P2 ca075 P5 cb075 P8 cc075
#> 3 P3 ca050 P6 cb050 P9 cc050
  

Комментарии:

1. функция не работает, поскольку она не возвращает никаких выходных данных

2. Я использую R 4.0.3 и stringr версии 1.4.0. А как насчет вас? Возможно, у вас более старая версия stringr. Попробуйте обновить пакет: update.package("stringr")

3. при вызове функции замените df на имя вашего фрейма данных.

Ответ №2:

Мы можем сравнить каждый столбец с элементом, который вы ищете, а затем вернуть соответствующее colname:

 df <- read.table(text="1    2     3    4     5     6
P1 ca100  P4  cb100  P7   cc100
P2 ca075  P5  cb075  P8   cc075
P3 ca050  P6  cb050  P9   cc050",header=T)


colName.of.Element <- function(df, el)
{
matched.cols <- apply(df, 2, function(col) any(col == el))
return(colnames(df[matched.cols]))
}


colName.of.Element(df,"P1")
[1] "X1"
colName.of.Element(df,"ca100")
[1] "X2"