如何基于将一列的部分与另一个数据框中的值相匹配来填充R中的列

如何基于将一列的部分与另一个数据框中的值相匹配来填充R中的列,r,R,我有两个数据帧,一个是我的数据帧,另一个是查找表。该数据包括一个名为claims的列;其单元格中填充了一个或多个代码,用于识别在特定案件中提出的法律索赔类型。每行代表一个案件。多种类型的声明用分号分隔 查找数据框有三列:代码、类别和so\U类别。代码列列出了数据的索赔列中使用的每个唯一索赔代码。类别包含一个分配给该类索赔的类别I,因此_类别分配一个更高级别的类别,该类别适合该类别 我想做的是为每个类别和so_类别的数据添加列,根据案例中是否存在与每个类别和so_类别对应的索赔,这些列将仅用0或1

我有两个数据帧,一个是我的数据帧,另一个是查找表。该数据包括一个名为claims的列;其单元格中填充了一个或多个代码,用于识别在特定案件中提出的法律索赔类型。每行代表一个案件。多种类型的声明用分号分隔

查找数据框有三列:代码、类别和so\U类别。代码列列出了数据的索赔列中使用的每个唯一索赔代码。类别包含一个分配给该类索赔的类别I,因此_类别分配一个更高级别的类别,该类别适合该类别

我想做的是为每个类别和so_类别的数据添加列,根据案例中是否存在与每个类别和so_类别对应的索赔,这些列将仅用0或1填充

下面是我的数据帧的外观示例:

data
Case      claims
1         wiretap;fdcpa
2         ca_ucl;comlaw
3         tort;comlaw;wiretap;ca_ucl
因此,我希望以编程方式生成如下内容:

data
Case      claims                      f_stat   st_stat   common_law
1         wiretap;fdcpa               1        0         0
2         ca_ucl;comlaw               0        1         1
3         tort;comlaw;wiretap;ca_ucl  1        1         1

我是R的新手,对于如何做到这一点我感到非常困惑。任何指导都将不胜感激

在base R中,我们可以找到所有需要匹配的唯一so_类别all_类别。对索赔进行分割;并将它们中的每一个与查找中的代码进行匹配,得到相应的so_类别,并根据所有_类别中是否存在该类别给出1/0值

资料

这是tidyverse的一个选项,我们在分隔符处拆分“claims”列;使用单独的_行,然后与“lookup”数据集进行左_连接,在获得不同的行后将其扩展为“wide”格式,并将输出与原始数据集连接

library(tidyverse)
data %>% 
  separate_rows(claims, sep=";") %>%
  left_join(lookup, by = c("claims" = "code")) %>%
  select(-claims, -category) %>%
  distinct(Case, so_category) %>% 
  mutate(val = 1) %>% 
  spread(so_category, val, fill = 0) %>% 
  right_join(data) %>% 
  select(names(data), everything())
#   Case                     claims common_law f_statute st_statute
#1    1              wiretap;fdcpa          0         1          0
#2    2              ca_ucl;comlaw          1         0          1
#3    3 tort;comlaw;wiretap;ca_ucl          1         1          1
数据
谢谢你的帮助!当我尝试在完整数据集上运行您建议的内容时,它抛出一个错误:替换元素1有5行,需要182行。数据确实有182行,完整的so_类别有5行。
all_category <- unique(lookup$so_category)

data[all_category] <- t(sapply(strsplit(data$claims, ";"), function(x)
          as.integer(all_category %in% lookup$so_category[match(x, lookup$code)])))

data
#  Case                     claims f_statute st_statute common_law
#1    1              wiretap;fdcpa         1          0          1
#2    2              ca_ucl;comlaw         0          1          1
#3    3 tort;comlaw;wiretap;ca_ucl         1          1          1
data <- structure(list(Case = 1:3, claims = c("wiretap;fdcpa", 
"ca_ucl;comlaw", "tort;comlaw;wiretap;ca_ucl")), 
row.names = c(NA, -3L), class = "data.frame")

lookup <- structure(list(code = c("wiretap", "fdcpa", "ca_ucl", "comlaw", 
"tort"), category = c("f_wiretap", "f_con_prot", "st_con_prot", 
"com_law", "com_law"), so_category = c("f_statute", "f_statute", 
"st_statute", "common_law", "common_law")), row.names = c(NA, 
-5L), class = "data.frame")
library(tidyverse)
data %>% 
  separate_rows(claims, sep=";") %>%
  left_join(lookup, by = c("claims" = "code")) %>%
  select(-claims, -category) %>%
  distinct(Case, so_category) %>% 
  mutate(val = 1) %>% 
  spread(so_category, val, fill = 0) %>% 
  right_join(data) %>% 
  select(names(data), everything())
#   Case                     claims common_law f_statute st_statute
#1    1              wiretap;fdcpa          0         1          0
#2    2              ca_ucl;comlaw          1         0          1
#3    3 tort;comlaw;wiretap;ca_ucl          1         1          1
data <- structure(list(Case = 1:3, claims = c("wiretap;fdcpa", 
"ca_ucl;comlaw", "tort;comlaw;wiretap;ca_ucl")), 
row.names = c(NA, -3L), class = "data.frame")

lookup <- structure(list(code = c("wiretap", "fdcpa", "ca_ucl", "comlaw", 
"tort"), category = c("f_wiretap", "f_con_prot", "st_con_prot", 
"com_law", "com_law"), so_category = c("f_statute", "f_statute", 
"st_statute", "common_law", "common_law")), row.names = c(NA, 
-5L), class = "data.frame")