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