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