我在 R 中有 2 个数据框。
数据框 1 (df_1) 包含许多列,但这里只有 3 列相关:
Problem |Service_Time | Imputed_Problem
----------------------------------------------
A | 3.5 | NA
B | 1.6 | NA
C | 2.8 | NA
D | NA | B
当问题等于D时,这意味着该人在没有被看到的情况下离开了(可能是因为队列太长)。问题没有登记,没有服务时间。
我想了解需求,因此希望根据他们可能遇到的问题以及相关的服务时间(如果他们没有离开而没有被发现)将这些人包含在我的数据集中。我根据每个问题在总体中出现的比率,将问题(A、B 或 C)随机分配给所有问题 == D 的情况,从而将问题归咎于那些没有被发现就离开的人。
如果观察到的是“真实”问题,我有该案例的服务时间。在问题已被估算的情况下(此处未记录的问题 (D) 已被分配为 B),我想在名为“Impulated_Service_Time”的新列中分配该问题的平均服务时间。
我创建了一个数据框 (df_2),它给出了 3 个问题中每一个问题的平均服务时间。
Problem | Average_Service_Time
----------------------
A | 3.2
B | 4.2
C | 1.7
我在 df_1 中创建了一个名为“Impulated_Service_Time”的新列,它是“Service_Time”列的精确副本。
如何仅在“问题”列中的观测值为“D”时导入相应“Impulated_Problem”列的“Average_Service_Time”值?
我尝试过以下方法:
merged_df <- merge(df_1, df_2, by.x = "Imputed_Problem", by.y = "Problem", all.x = TRUE)
merged_df$Imputed_Service_Time <- ifelse(is.na(merged_df$Service_Time), merged_df$Average_Service_Time, merged_df$Service_Time)
但是我收到以下错误消息:
Error in ans[ypos] <- rep(yes, length.out = len)[ypos] :
replacement has length zero
In addition: Warning message:
In rep(yes, length.out = len) : 'x' is NULL so the result will be NULL
您可以尝试以下方法:
library(dplyr)
left_join(df_1, df_2, by=c("Imputed_Problem" = "Problem")) %>%
mutate(Imputed_Service_Time = case_when(
is.na(Imputed_Problem)~Service_Time,
.default = Average_Service_Time
))
输出:
Problem Service_Time Imputed_Problem Average_Service_Time Imputed_Service_Time
1 A 3.5 <NA> NA 3.5
2 B 1.6 <NA> NA 1.6
3 C 2.8 <NA> NA 2.8
4 D NA B 4.2 4.2