Как еще больше расплавить набор данных? - PullRequest
1 голос
/ 25 марта 2020

Я работаю со следующими данными:

#Reproducible Example
Bills <- c("93-HCONRES-106", "93-HCONRES-107", "93-HCONRES-108")
Members <- c("00134", "00416;00010;00017;00026", "00416;00503;00513;00568")

data <- data.frame(Bills, Members)

Где данные выглядят так:

#Data Structure
            Bills                 Members
1 93-HCONRES-106                   00134
2 93-HCONRES-107 00416;00010;00017;00026
3 93-HCONRES-108 00416;00503;00513;00568

Я хотел бы, чтобы набор данных расширился так, чтобы каждый счет соответствует каждому члену. Таким образом, данные выглядят так:

        Bills           Members
93-HCONRES-106          00134
93-HCONRES-107          00416
93-HCONRES-107          00010
93-HCONRES-107          00017
93-HCONRES-107          00026
93-HCONRES-108          00416
93-HCONRES-108          00503
93-HCONRES-108          00513
93-HCONRES-108          00568

Любой код, которым вы могли бы поделиться, был бы очень признателен.

Большое спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Использование data.table:

library(data.table)
dt1 <- data.table(Bills, Members)
dt2 <- melt(dt1[, c("V1", "V2", "V3", "V4") := tstrsplit(Members, ";")][, Members := NULL], id.vars = "Bills")[!is.na(value)][order(Bills)]
1 голос
/ 25 марта 2020

Мы можем использовать separate_rows из tidyr

library(dplyr)
library(tidyr)
data %>% 
     separate_rows(Members)
#         Bills Members
#1 93-HCONRES-106   00134
#2 93-HCONRES-107   00416
#3 93-HCONRES-107   00010
#4 93-HCONRES-107   00017
#5 93-HCONRES-107   00026
#6 93-HCONRES-108   00416
#7 93-HCONRES-108   00503
#8 93-HCONRES-108   00513
#9 93-HCONRES-108   00568

Или извлечь элементы в list и затем unnest

library(stringr)
data %>%
   mutate(Members = str_extract_all(Members, "[^;]+")) %>% 
   unnest(c(Members))

Или с base R

stack(setNames(strsplit(as.character(data$Members), ";"), data$Bills))
...