r - 使用 dplyr 对两列数据框中的对象进行分类

标签 r dplyr categorization

您好,我有一个示例数据框,如下所示:

   Policy_Holder_ID Insured_ID
   <chr>            <chr>     
 1 ID27343          ID215664  
 2 ID27310          ID27310   
 3 ID27343          ID205729  
 4 ID27343          ID205728  
 5 ID27348          ID205734  
 6 ID27348          ID205735  
 7 ID27315          ID205719  
 8 ID27315          ID27315   
 9 ID27345          ID205731  
10 ID27345          ID205733  
11 ID27345          ID27345   
12 ID2731           ID2731    
13 ID27310          ID205714  
14 ID27310          ID205715 

对不起,如果它不是 dput 形式。我尝试使用此功能,但没有得到正确的结果

我想要将此数据框分为 3 个不同的类别,如下所列:

  1. 第 1 组:为自己投保的保单持有人。换言之,Policy_Holder_IDInsured_ID 相同(例如:ID2731)
  2. 第 2 组:仅为他人购买保险的投保人。换句话说,他们列在 Policy_Holder_ID 但不在 Insured_ID 中,并且有 1 个或多个 Insured_ID(例如:ID27343)
  3. 第 3 组:为自己和他人购买保险的保单持有人(例如:ID27310)

所以输出应该是这样的:

   Policy_Holder_ID Insured_ID    group
   <chr>            <chr>     
 1 ID27343          ID215664         2
 2 ID27310          ID27310          3
 3 ID27343          ID205729         2
 4 ID27343          ID205728         2
 5 ID27348          ID205734         2
 6 ID27348          ID205735         2
 7 ID27315          ID205719         3
 8 ID27315          ID27315          3  
 9 ID27345          ID205731         3
10 ID27345          ID205733         3
11 ID27345          ID27345          3  
12 ID2731           ID2731           1  
13 ID27310          ID205714         3 
14 ID27310          ID205715         3

我希望您可以提供一个节省时间的解决方案,而不是使用 for 循环来处理数据。我的原始数据有超过 400000 行,所以 for 循环对我没有帮助。

最佳答案

我们可以在按'Policy_Holder_ID'分组后使用case_when。根据描述,如果我们有 'Insured_ID' 的 all 元素与 'Policy_Holder_ID' 匹配,则返回 1,如果它们都不匹配 (!= -> 再次使用all),然后返回 2,默认选项应该返回 3。

library(dplyr)
df1 %>% 
  group_by(Policy_Holder_ID) %>%
  mutate(group = case_when(all(Insured_ID == Policy_Holder_ID) ~ 1, 
          all(Insured_ID != Policy_Holder_ID)~ 2, 
       TRUE ~ 3)) %>%
  ungroup

-输出

# A tibble: 14 x 3
#   Policy_Holder_ID Insured_ID group
#   <chr>            <chr>      <dbl>
# 1 ID27343          ID215664       2
# 2 ID27310          ID27310        3
# 3 ID27343          ID205729       2
# 4 ID27343          ID205728       2
# 5 ID27348          ID205734       2
# 6 ID27348          ID205735       2
# 7 ID27315          ID205719       3
# 8 ID27315          ID27315        3
# 9 ID27345          ID205731       3
#10 ID27345          ID205733       3
#11 ID27345          ID27345        3
#12 ID2731           ID2731         1
#13 ID27310          ID205714       3
#14 ID27310          ID205715       3

数据

df1 <- structure(list(Policy_Holder_ID = c("ID27343", "ID27310", "ID27343", 
"ID27343", "ID27348", "ID27348", "ID27315", "ID27315", "ID27345", 
"ID27345", "ID27345", "ID2731", "ID27310", "ID27310"), Insured_ID = c("ID215664", 
"ID27310", "ID205729", "ID205728", "ID205734", "ID205735", "ID205719", 
"ID27315", "ID205731", "ID205733", "ID27345", "ID2731", "ID205714", 
"ID205715")), class = "data.frame", row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14"))

关于r - 使用 dplyr 对两列数据框中的对象进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66216742/

相关文章:

r - 如何定义 R 函数的参数类型?

r - 使用管道运算符对同一行中另一列的变量值进行寻址

快速修改结构的通用属性

使用 dplyr 按组/id 滚动平均值(移动平均值)

unit-testing - 测试分类

algorithm - 分类文本时自动将类别相互链接

r - 创建/查看后放大 ggplot

仅使用模型对象重现二项式 glm

r - 尝试将 .csv 文件读入 R 时出现“不完整的最后一行”警告

machine-learning - LibSVM 和非数值数据