Порог для флага нескольких столбцов в R - PullRequest
0 голосов
/ 13 июля 2020
Id Task1 Task2 Task3 Task4
1   90    92    90    94
2   90    94    91    96
3   90    70    95    40
4   90    66    99    33

У меня есть таблица, подобная приведенной выше (называемая df), как мне отметить каждую строку, в которой Task1-Task4 больше 90? Я хочу сделать это без индивидуальной проверки порога для каждой задачи. Пока мне удалось это сделать, только проверив все 4 столбца. Какой более динамичный c способ сделать это в R с использованием синтаксиса tidyverse?

Ответы [ 4 ]

0 голосов
/ 13 июля 2020

Мы можем использовать rowSums

df$flag <- rowSums(df[-1] >90) == ncol(df[-1])

Или с Reduce

df$flag <- Reduce(`&`, lapply(df[-1], `>`, 90))

данные

df <- structure(list(Id = 1:4, Task1 = c(90L, 90L, 90L, 90L), Task2 = c(92L, 
94L, 70L, 66L), Task3 = c(90L, 91L, 95L, 99L), Task4 = c(94L, 
96L, 40L, 33L)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 13 июля 2020

Вы можете использовать dplyr >= 1.0.0 s rowwise(). Обратите внимание, что в вашем примере данных ни одна строка не имеет значения больше 90 во всех четырех столбцах. .3.0)

0 голосов
/ 13 июля 2020

Ознакомьтесь с основными функциями c R. Вы можете использовать apply с MARGIN=1:

df <- read.table(text = 
                   "
    Id Task1 Task2 Task3 Task4
    1   90    92    90    94
    2   90    94    91    96
    3   90    70    95    40
    4   90    66    99    33
    ", header = T)

# assuming strictly greater, threshold = 90
df$flag <- apply(df, MARGIN = 1, FUN = function(x, thres) all(x[-1] > thres),
                 thres=90)

. Вы можете указать вектор пороговых значений, если он отличается для каждой строки (Id).

0 голосов
/ 13 июля 2020

Проверьте, не превышает ли минимум задач в строке 90.

library(dplyr)


df <- read.table(text = 
                   "
Id Task1 Task2 Task3 Task4
1   90    92    90    94
2   90    94    91    96
3   90    70    95    40
4   90    66    99    33
", header = T)


df %>% 
  rowwise() %>% 
  mutate(flag =min(across(starts_with('Task'))) >= 90)
#> # A tibble: 4 x 6
#> # Rowwise: 
#>      Id Task1 Task2 Task3 Task4 flag 
#>   <int> <int> <int> <int> <int> <lgl>
#> 1     1    90    92    90    94 TRUE 
#> 2     2    90    94    91    96 TRUE 
#> 3     3    90    70    95    40 FALSE
#> 4     4    90    66    99    33 FALSE
...