Динамически выделять столбцы в R с помощью end_with - PullRequest
0 голосов
/ 17 октября 2018

У меня есть фрейм данных, в котором я хочу уменьшить его размер, выбрав все экземпляры, ИСТИНА появляется в фрейме данных.

Вот фрейм данных:

df<-structure(c("1", "2", "3", "4", "5", "TRUE", "FALSE", "TRUE", 
"TRUE", "FALSE", "FALSE", "FALSE", "FALSE", "TRUE", "FALSE", 
"TRUE", "FALSE", "FALSE", "TRUE", "FALSE", "a", "b", "c", "d", 
"e"), .Dim = c(5L, 5L), .Dimnames = list(NULL, c("A", "B_down", 
"C_down", "D_down", "E")))

Чтобы уменьшить фрейм данных до значения TRUE, я использовал этот код:

df[which(apply(df[,c(2:4)],1,function(x) any(x)=="TRUE")),]

Однако я вручную выбрал столбцы c(2: 4) - B_down , C_down , D_down, , поскольку они имеют _down окончание.Как выбрать эти столбцы динамически в R, без жесткого кодирования.

Я вижу в [post here] ( фильтрация с несколькими условиями по многим столбцам с использованием dplyr ), можно использовать select (df, заканчивается_with ("_ down")) , но это дает мне только частичный кадр данных.Я хочу, чтобы вся структура данных сохранялась, как указано выше.

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Существуют более эффективные способы обработки ваших данных, но при продолжении рабочего процесса на вашем примере это будет работать.

df[apply(df[, endsWith(colnames(df), "_down")], 1, function(x) any(x == "TRUE")), ]

#      A   B_down C_down  D_down  E  
#[1,] "1" "TRUE" "FALSE" "TRUE"  "a"
#[2,] "3" "TRUE" "FALSE" "FALSE" "c"
#[3,] "4" "TRUE" "TRUE"  "TRUE"  "d"

Другой подход будет

df[rowSums(df[, endsWith(colnames(df), "_down")] == "TRUE") > 0, ]

#      A   B_down C_down  D_down  E  
#[1,] "1" "TRUE" "FALSE" "TRUE"  "a"
#[2,] "3" "TRUE" "FALSE" "FALSE" "c"
#[3,] "4" "TRUE" "TRUE"  "TRUE"  "d"
0 голосов
/ 17 октября 2018

Мы можем использовать type.convert с is.logical для динамической проверки типов столбцов

i1 <- sapply(as.data.frame(df, stringsAsFactors = FALSE), 
           function(x) is.logical(type.convert(x)))

Если это только для тех столбцов, которые имеют «вниз» в имени столбца, иметь другой логический вектор сgrepl

i2 <- grepl("_down$", colnames(df))
i1 & i2
#     A B_down C_down D_down      E 
# FALSE   TRUE   TRUE   TRUE  FALSE 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...