R 将相同的字符串状态应用于具有相似应用程序id和用户id的所有行

R 将相同的字符串状态应用于具有相似应用程序id和用户id的所有行,r,dplyr,data-manipulation,R,Dplyr,Data Manipulation,对于不同的组合user\u status\u 1和user\u status\u 2和application\u status=='complete'我创建了一个最终状态,即final\u status。我想将相同的final\u status应用于具有相同application\u id和user\u id的所有行。请在下面查看所需结果 我的数据集 library(data.table) library(dplyr) df <- data.table(application_id = c

对于不同的组合
user\u status\u 1
user\u status\u 2
application\u status=='complete'
我创建了一个最终状态,即
final\u status
。我想将相同的
final\u status
应用于具有相同
application\u id
user\u id
的所有行。请在下面查看所需结果

我的数据集

library(data.table)
library(dplyr)
df <- data.table(application_id = c(1,1,1,2,2,2,3,3,3), 
                 user_id = c(123,123,123,456,456,456,789,789,789), 
                 date = c("01/01/2018", "02/01/2018", "03/01/2018"),
                 application_status = c("incomplete", "details_verified", "complete"),
                 user_status_1 = c("x", "y", "z", "x", "y", "z", "x", "y", "z"),
                 user_status_2 = c("a","b", "c", "d", "e", "f", "g", "h", "i")) %>%
  mutate(date = as.Date(date, "%d/%m/%Y"))
df %>% group_by(application_id, user_id) %>%
  mutate(final_status = case_when(any(
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "c" ~ "good",
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "f" ~ "great",
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "i" ~ "excellent"
    )))
我失败的努力

library(data.table)
library(dplyr)
df <- data.table(application_id = c(1,1,1,2,2,2,3,3,3), 
                 user_id = c(123,123,123,456,456,456,789,789,789), 
                 date = c("01/01/2018", "02/01/2018", "03/01/2018"),
                 application_status = c("incomplete", "details_verified", "complete"),
                 user_status_1 = c("x", "y", "z", "x", "y", "z", "x", "y", "z"),
                 user_status_2 = c("a","b", "c", "d", "e", "f", "g", "h", "i")) %>%
  mutate(date = as.Date(date, "%d/%m/%Y"))
df %>% group_by(application_id, user_id) %>%
  mutate(final_status = case_when(any(
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "c" ~ "good",
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "f" ~ "great",
    application_status == "complete" & user_status_1 == "z" & user_status_2 == "i" ~ "excellent"
    )))
所需结果*(水平滚动以查看所有列)*

application_id user_id       date application_status user_status_1 user_status_2 final_status
              1     123 2018-01-01         incomplete             x             a         good
              1     123 2018-01-02   details_verified             y             b         good
              1     123 2018-01-03           complete             z             c         good
              2     456 2018-01-01         incomplete             x             d        great
              2     456 2018-01-02   details_verified             y             e        great
              2     456 2018-01-03           complete             z             f        great
              3     789 2018-01-01         incomplete             x             g    excellent
              3     789 2018-01-02   details_verified             y             h    excellent
              3     789 2018-01-03           complete             z             i    excellent

您很接近–您只需要用
any
包装每个逻辑语句

df %>% 
  group_by(application_id, user_id) %>%
  mutate(final_status = case_when(
    any(application_status == "complete" & user_status_1 == "z" & user_status_2 == "c") ~ "good",
    any(application_status == "complete" & user_status_1 == "z" & user_status_2 == "f") ~ "great",
    any(application_status == "complete" & user_status_1 == "z" & user_status_2 == "i") ~ "excellent"
  ))

这里有一个选项,首先创建一个名为的
向量

library(data.table)
nm1 <- setNames(c('good', 'great', 'excellent'), 
             c('completezc', 'completezf', 'completezi'))
nm2 <- do.call(paste0, df[4:6])
setDT(df)[, final_status := nm1[nm2]][,
    final_status := final_status[complete.cases(final_status)], 
            .(application_id, user_id)]
df
#   application_id user_id       date application_status user_status_1 user_status_2 final_status
#1:              1     123 2018-01-01         incomplete             x             a         good
#2:              1     123 2018-01-02   details_verified             y             b         good
#3:              1     123 2018-01-03           complete             z             c         good
#4:              2     456 2018-01-01         incomplete             x             d        great
#5:              2     456 2018-01-02   details_verified             y             e        great
#6:              2     456 2018-01-03           complete             z             f        great
#7:              3     789 2018-01-01         incomplete             x             g    excellent
#8:              3     789 2018-01-02   details_verified             y             h    excellent
#9:              3     789 2018-01-03           complete             z             i    excellent