我有两个数据帧,一个带有我的数据(data
),另一个带有查询表(lookup
)。数据包括名为claims
的列;其单元格中填充着一个或多个代码,用于标识在特定案件中提出的法律要求的类型(每一行代表一个案件)。多种类型的索赔用分号分隔。
lookup
数据帧具有三列:code
,category
和so_category
。 code
列列出了claims
的{{1}}列中使用的每个唯一声明代码。 data
包含我分配给该声明的类别,category
分配了特定so_category
所适合的更高级别的类别。
我想做的是向category
和data
的{{1}}中添加一列,根据是否有{{1} }(分别对应于category
和so_category
)。
以下是我的数据框的示例:
claims
category
所以我想以编程方式生成的内容是:
so_category
我对R还是很陌生,很茫然地想出如何做到这一点-任何指导都将不胜感激!
答案 0 :(得分:1)
在基数R中,我们可以找到所有需要匹配的unique
so_category
(all_category
)。将claims
和;
上的match
与code
中的lookup
分开,得到相应的so_category
并给出1/0值基于all_category
中类别的存在/不存在。
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")
答案 1 :(得分:0)
这是tidyverse
的一个选项,其中我们用;
分隔定界符separate_rows
的'claims'列,然后使用(left_join
)进行联接(spread
) 'lookup'数据集,在获取distinct
行并将其输出与原始数据集连接后,将其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
转换为'wide'格式
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")
{{1}}