Как выбрать значения столбца на основе условия больше чем в значениях строки - PullRequest
2 голосов
/ 08 марта 2019

Я хочу выбрать столбцы из фрейма данных, если любое из значений в столбце больше 3.

В этом примере mtcars этот критерий упадет vs и am,поскольку в этих столбцах нет значения больше 3.

                 mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2

Ответы [ 3 ]

2 голосов
/ 08 марта 2019

Мы можем создать логический вектор, сравнив фрейм данных с 3, а затем взять сумму столбцов, используя colSums, и выбрать только те столбцы, у которых хотя бы одно значение больше 3.

mtcars[colSums(mtcars > 3) > 0]

#                     mpg cyl  disp  hp drat    wt  qsec gear carb
#Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
#Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
#Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
#Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
#....

Изменение с использованием sapply

mtcars[sapply(mtcars, function(x) any(x > 3))]
1 голос
/ 08 марта 2019

С purrr:

mtcars[,purrr::map_lgl(mtcars,~any(.x>3))]

Вывод (усеченный):

   #                      mpg cyl  disp  hp drat    wt  qsec gear carb
   # Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46    4    4
   # Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02    4    4
   # Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61    4    1
   # Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44    3    1
   # Hornet Sportabout   18.7   8 360.0 175 3.15 3.440 17.02    3    2
0 голосов
/ 08 марта 2019

Я думаю

## find max val for each column
maxcolval <- apply(mtcars,MARGIN=2,FUN=max)
## select columns
mtcars[maxcolval>3]

делает то, что вы хотите. Если вы хотите получить решение по принципу Tidyverse (так как у вас есть dplyr в тегах),

library(dplyr) 
mtcars %>% select_if(~max(.)>3)
...