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