Мутирование нескольких столбцов, чтобы получить 1 или 0 для условий passfail - PullRequest
0 голосов
/ 10 января 2019

У меня есть такой фрейм данных

ID <- c("A","A","A","A","A","A","A","A")
Step <- c("Step_1","Step_1","Step_2","Step_2","Step_3","Step_3","Step_3","Step_4")
Passfail <- c("Pass","Pass","Fail","Pass","Fail","Fail","Pass","Fail")
Measurement <- c("Length","Length","Breadth","Breadth",
                 "Height","Height","Height","Width")

df <- data.frame(ID,Step,Passfail,Measurement)

Я пытаюсь создать несколько столбцов, которые при значении true должны возвращать 1, иначе 0 GROUPED by (Measurement, ID, ToolID)

Для каждой группы

  1. AP = 1, если только проходит в passfail
  2. AF = 1, если терпит неудачу только в passfail
  3. SFP = 1, если только 1 сбой и по крайней мере 1 проход в passfail
  4. MFP = 1, если больше чем 1 сбой и по крайней мере 1 проход в passfail.

Желаемый выход is

  Measurement ID   Step AP AF SFP MFP
       Length  A Step_1  1  0   0   0
      Breadth  A Step_2  0  0   1   0
       Height  A Step_3  0  0   0   1
        Width  A Step_4  0  1   0   0

Я пытаюсь таким образом получить столбцы AP и AF, но не совсем понимаю

library(dplyr)
df1 <- df %>%
  group_by(Measurement,ID,Step) %>% 
  mutate(AP = case_when((Passfail == "Pass" & Passfail != "Fail") ~ 1, TRUE ~ 0),
         AF = case_when((Passfail == "Fail" & Passfail != "Pass") ~ 1, TRUE ~ 0)
         ) %>%
  distinct()

1 Ответ

0 голосов
/ 10 января 2019

Вот исправленная версия вашего подхода:

df %>%
  group_by(Measurement,ID,Step) %>% 
  summarize(AP = case_when(all(Passfail == "Pass") ~ 1, TRUE ~ 0),
            AF = case_when(all(Passfail == "Fail") ~ 1, TRUE ~ 0),
            SFP = case_when(sum(Passfail == "Fail") == 1 & sum(Passfail == "Pass") > 0 ~ 1, TRUE ~ 0),
            MFP = case_when(sum(Passfail == "Fail") > 1 & sum(Passfail == "Pass") > 0 ~ 1, TRUE ~ 0))
# A tibble: 4 x 7
# Groups:   Measurement, ID [?]
#   Measurement ID    Step      AP    AF   SFP   MFP
#   <fct>       <fct> <fct>  <dbl> <dbl> <dbl> <dbl>
# 1 Breadth     A     Step_2     0     0     1     0
# 2 Height      A     Step_3     0     0     0     1
# 3 Length      A     Step_1     1     0     0     0
# 4 Width       A     Step_4     0     1     0     0

При all(...) мы требуем, чтобы условие выполнялось для всех случаев Passfail, а при sum(Passfail == "Fail") мы подсчитываем количество отказов. С помощью этих двух методов мы рассмотрим все четыре случая.

Обратите внимание, что, поскольку для каждой переменной у вас есть только два случая, вы также можете немного упростить код до

df %>% 
  group_by(Measurement,ID,Step) %>% 
  summarize(AP = 1 * all(Passfail == "Pass"),
            AF = 1 * all(Passfail == "Fail"),
            SFP = 1 * (sum(Passfail == "Fail") == 1 & sum(Passfail == "Pass") > 0),
            MFP = 1 * (sum(Passfail == "Fail") > 1 & sum(Passfail == "Pass") > 0))

Логические выражения дают TRUE или FALSE, и при умножении на 1 мы при необходимости приводим эти логические векторы в двоичные.

...