Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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

Ответ 2

Вы также можете использовать starts_with и dplyr select() так:

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

Ответ 3

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

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

Ответ 4

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

df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]

Ответ 5

На всякий случай для пользователей data.table у меня работает следующее:

df[, grep("ABC", names(df)), with = FALSE]