Добавить дополнительный столбец на основе содержимого других (в R)

#r

#r

Вопрос:

У меня есть фрейм данных с 3 qc. Я хотел бы создать 4-й столбец, где результат будет зависеть от всех 3 qc. Условие: по крайней мере 2 должны быть «плохими», чтобы отображаться в qc4 плохо, иначе хорошо.

   ID qc1  qc2  qc3
1 AV bad  good bad
2 AX bad  bad  bad
3 AS good good good
4 AW good bad  bad
 

Результат

   ID qc1  qc2  qc3  q4
1 AV bad  good bad  bad
2 AX bad  bad  bad  bad
3 AS good good good good
4 AW good bad  bad  bad
 

Ответ №1:

Мы можем построить логический вектор с rowSums помощью и использовать ifelse для создания «плохого», «хорошего» на основе значения из логического вектора

 nm1 <- grep("^qc\d $", names(df), value = TRUE)
df$q4 <- ifelse(rowSums(df[nm1] == "bad") >=2, "bad", "good")
df
#  ID  qc1  qc2  qc3   q4
#1 AV  bad good  bad  bad
#2 AX  bad  bad  bad  bad
#3 AS good good good good
#4 AW good  bad  bad  bad
 

Или другой вариант с rowwise/c_across помощью from dplyr

 library(dplyr)
df %>% 
   rowwise %>%
   mutate(q4 = c("good", "bad")[1 (sum(c_across(starts_with('qc')) ==
       'bad') >= 2)]) %>%
   ungroup
 

данные

 df <- structure(list(ID = c("AV", "AX", "AS", "AW"), qc1 = c("bad", 
"bad", "good", "good"), qc2 = c("good", "bad", "good", "bad"), 
    qc3 = c("bad", "bad", "good", "bad")), class = "data.frame",
    row.names = c("1", 
"2", "3", "4"))
 

Ответ №2:

Другой базовый параметр R, использующий rowSums

 df$qc4 <- c("good", "bad")[1   (rowSums(df == "bad") >= 2)]
 

такое, что

 > df
  ID  qc1  qc2  qc3  qc4
1 AV  bad good  bad  bad
2 AX  bad  bad  bad  bad
3 AS good good good good
4 AW good  bad  bad  bad
 

Данные

 > dput(df)
structure(list(ID = c("AV", "AX", "AS", "AW"), qc1 = c("bad", 
"bad", "good", "good"), qc2 = c("good", "bad", "good", "bad"),
    qc3 = c("bad", "bad", "good", "bad"), qc4 = c("bad", "bad",
    "good", "bad")), row.names = c("1", "2", "3", "4"), class = "data.frame")