Подмножество данных содержит только столбцы, имена которых соответствуют условию

Есть ли способ для меня подмножить данные на основе имен столбцов, начиная с определенной строки? У меня есть несколько столбцов, которые похожи на ABC_1 ABC_2 ABC_3 а некоторые вроде XYZ_1, XYZ_2,XYZ_3 , скажем так.

Как я могу подмножить свой df основанный только на столбцах, содержащих вышеуказанные части текста (скажем, ABC или XYZ )? Я могу использовать индексы, но столбцы слишком разбросаны по данным, и это становится слишком большим количеством жесткого кодирования.

Кроме того, я хочу включать только строки из каждого из этих столбцов, где любое их значение равно >0 поэтому, если в одном из 6 столбцов выше есть 1 в строке, он делает разрез в мой окончательный кадр данных.

Попробуйте grepl по именам вашего data.frame . grepl сопоставляет регулярное выражение с целью и возвращает TRUE если совпадение найдено и FALSE противном случае. Функция векторизована так, что вы можете передать вектор строк для соответствия, и вы получите вектор возвращаемых значений boolean.

пример

 # Data df <- data.frame( ABC_1 = runif(3), ABC_2 = runif(3), XYZ_1 = runif(3), XYZ_2 = runif(3) ) # ABC_1 ABC_2 XYZ_1 XYZ_2 #1 0.3792645 0.3614199 0.9793573 0.7139381 #2 0.1313246 0.9746691 0.7276705 0.0126057 #3 0.7282680 0.6518444 0.9531389 0.9673290 # Use grepl df[ , grepl( "ABC" , names( df ) ) ] # ABC_1 ABC_2 #1 0.3792645 0.3614199 #2 0.1313246 0.9746691 #3 0.7282680 0.6518444 # grepl returns logical vector like this which is what we use to subset columns grepl( "ABC" , names( df ) ) #[1] TRUE TRUE FALSE FALSE 

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

 set.seed(1) df <- data.frame( ABC_1 = sample(0:1,3,repl = TRUE), ABC_2 = sample(0:1,3,repl = TRUE), XYZ_1 = sample(0:1,3,repl = TRUE), XYZ_2 = sample(0:1,3,repl = TRUE) ) # We will want to discard the second row because 'all' ABC values are 0: # ABC_1 ABC_2 XYZ_1 XYZ_2 #1 0 1 1 0 #2 0 0 1 0 #3 1 1 1 0 df1 <- df[ , grepl( "ABC" , names( df ) ) ] ind <- apply( df1 , 1 , function(x) any( x > 0 ) ) df1[ ind , ] # ABC_1 ABC_2 #1 0 1 #3 1 1 

Вы также можете использовать starts_with и dplyr ‘s select() следующим образом:

 df <- df %>% dplyr:: select(starts_with("ABC")) 

Используя dplyr, вы можете:

 df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df))) 

Это сработало для меня:

 df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]] 
  • Возвращать временные frameworks подмножества данных в другие временные frameworks?
  • Как подмножить матрицу в один столбец, сохранить тип данных матрицы, поддерживать имена строк / столбцов?
  • Подмножество строк, содержащих значения NA (отсутствует) в выбранном столбце кадра данных
  • Как заменить NA на подмножество в R (приписывать plyr?)
  • Как определить операторы подмножества для classа S4?
  • Подмножество кадра данных между двумя датами
  • Как подмножить данные в R без потери строк NA?
  • Давайте будем гением компьютера.