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

У меня есть два кадра данных, где один представляет собой когорту, в которой каждое наблюдение представляет собой одного человека, а другое - реестр посещений, причем каждое наблюдение представляет собой посещение.

Мне необходимо изучить детали каждого посещения (количество посещений по определенной c причине, времени для первого посещения), но не может понять, как этого добиться.

Каждый человек в первом кадре данных имеет уникальный идентификатор, который также можно найти во втором кадре данных (но каждый идентификатор может встречаться несколько раз во втором фрейме данных).

df1 <- data.frame(id = 1:5)
df2 <- data.frame(id = c(1,2,3,3,3,4,5,5),
                  date = as.Date("2017-01-01") + 10*0:7
                  reason = c("A B C", "A E", "E F", "A D F","D","F A","B","D A"),
                  stringsAsFactors = TRUE)

В связи с этим возникает другая проблема, заключающаяся в том, что для каждого посещения может быть несколько причин, и они разделяются пробелом.

Я попытался найти решения для достижения этой цели и подумать, что я мог бы создать новые переменные в первом кадре данных, которые будут сгенерированы из данных во втором кадре данных, чтобы иметь всю информацию, необходимую для анализа в одном и том же кадре данных, и затем сделайте мой анализ.

Быть довольно новым для RI не было Я могу понять, как это сделать. Это разумный способ go о проблеме? Как это можно сделать?

Мне удалось успешно отфильтровать строки по интересующим меня причинам, а затем соединить два кадра данных.

combined <- df2 %>%
    filter(str_detect(reason,"B|E")) %>%
    distinct(id, .keep_all = TRUE %>%
    right_join(df1)

Теперь у меня есть дата и причина для контакта для первого посещения по любой из причин, которые меня интересуют. Я также хотел бы иметь новую переменную с числом посещений по любой из причин, которые я ищу. То есть подсчитайте строки, где причина = A и / или E (например).

Я бы хотел, чтобы результат был примерно таким:

id     firstdate     reasons     visits
1      2017-01-01    A B C       1

Которого мне удалось достичь с:

df2 %>% 
  filter(str_detect(reason,"A|E")) %>% 
  group_by(id) %>% 
  tally(name="visits")
```

1 Ответ

1 голос
/ 23 февраля 2020

Учитывая данные этого примера:

# (BTW, it's standard practice to include this yourself in your question. 
#   This helps reduce the potential for misunderstandings about what you're starting from 
#   and where you're trying to get.)
set.seed(1)
df1 <- data.frame(ID = 1:3, stringsAsFactors = F)
df2 <- data.frame(ID = trunc(runif(6, 1, 5)),
                  date = as.Date("2019-01-01") + 40*0:5,
                  reason = c("A B C", "F", "B G", "C", "D E", "Z"),
                  stringsAsFactors = F)
#> df1
#  ID
#1  1
#2  2
#3  3

#  ID       date reason
#1  2 2019-01-01  A B C
#2  2 2019-02-10      F
#3  3 2019-03-22    B G
#4  4 2019-05-01      C
#5  1 2019-06-10    D E
#6  4 2019-07-20      Z

Мы можем использовать left_join из dplyr (в метапакете tidyverse) и separate_rows из tidyr (также в tidyverse) чтобы получить данные в отдельных строках:

library(tidyverse)
df1 %>%
  left_join(df2) %>%    # This connects each matching row from df2 to df1
  separate_rows(reason) # This makes new rows for each separate entry in "reason"

#Joining, by = "ID"
#  ID       date reason
#1  1 2019-06-10      D
#2  1 2019-06-10      E
#3  2 2019-01-01      A
#4  2 2019-01-01      B
#5  2 2019-01-01      C
#6  2 2019-02-10      F
#7  3 2019-03-22      B
#8  3 2019-03-22      G
...