Как заполнить столбцы в R на основе сопоставления частей одного столбца со значениями в другом фрейме данных - PullRequest
0 голосов
/ 28 июня 2019

У меня есть два фрейма данных, один с моими данными (data) и один с таблицей поиска (lookup).Данные включают столбец с именем claims;его ячейки заполнены одним или несколькими кодами, идентифицирующими типы юридических претензий, поданных в конкретном случае (каждая строка представляет один случай).Несколько типов заявок разделяются точкой с запятой.

Фрейм данных lookup имеет три столбца: code, category и so_category.В столбце code перечислены все уникальные коды претензий, используемые в столбце claims в data.category содержит категорию, которую я назначил для такого рода претензий, а so_category назначает категорию более высокого уровня, к которой относится данный конкретный category.

Я пытаюсь добавить столбцы вdata для каждого category и so_category, которые будут просто заполнены 0 или 1, в зависимости от того, есть ли claims в случае, которые соответствуют каждому category и so_category.

Ниже приведен пример того, как выглядят мои фреймы данных:

data
Case      claims
1         wiretap;fdcpa
2         ca_ucl;comlaw
3         tort;comlaw;wiretap;ca_ucl
lookup
code     category     so_category
wiretap  f_wiretap    f_statute
fdcpa    f_con_prot   f_statute
ca_ucl   st_con_prot  st_statute
comlaw   com_law      common_law
tort     com_law      common_law

Итак, что я хотел бы сгенерировать программно, это что-то вроде:

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, и я в значительной степени в замешательстве, чтобы понять, как это сделать - любое руководство будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 28 июня 2019

В базе 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")
0 голосов
/ 28 июня 2019

Вот вариант с tidyverse, где мы разделяем столбец «заявки» на разделитель ; с separate_rows, затем выполняем объединение (left_join) с набором данных «поиск», spreadпосле получения строк 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

data

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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...