Использование данных из одного набора данных для извлечения информации из другого набора данных - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть два набора данных.У каждого есть информация для здоровья каждого предмета.Другой имеет информацию до и после даты МРТ.Я пытаюсь извлечь информацию о состоянии здоровья на основе этих дат до / после.

Набор данных до / после МРТ:

ID  prescan PreDate Postscan    PostDate
5006    1   5/10/2018   1   6/14/2018
5007    1   5/15/2018   1   6/13/2018
5009    1   5/9/2018    1   6/11/2018
5011    1   5/31/2018   1   7/2/2018
5013    1   5/30/2018   1   7/5/2018

Образец данных сна:

SubID   SleepDate   Day of Week RHR HRV Recovery
5007    5/12/2018   'Saturday ' 63  95  65
5007    5/13/2018   'Sunday   ' 66  72  52
5010    5/7/2018    'Monday   ' 74  40  48
5010    5/8/2018    'Tuesday  ' 68  67  59
5010    5/9/2018    'Wednesday' 75  74  82
5010    5/10/2018   'Thursday ' 71  80  89
5010    5/11/2018   'Friday   ' 71  91  95
5010    5/12/2018   'Saturday ' 68  66  58
5008    5/7/2018    'Monday   ' 60  132 85
5008    5/8/2018    'Tuesday  ' 60  123 90
5008    5/9/2018    'Wednesday' 66  105 68
5009    5/7/2018    'Monday   ' 47  148 90
5009    5/8/2018    'Tuesday  ' 45  169 87
5009    5/9/2018    'Wednesday' 46  176 75
5009    5/10/2018   'Thursday ' 50  138 54
5009    5/11/2018   'Friday   ' 46  132 42
5009    5/12/2018   'Saturday ' 47  158 60
5009    5/13/2018   'Sunday   ' 47  141 54
5006    5/7/2018    'Monday   ' 56  92  65

То, что я пробовал (и варианты этого)

SleepData %>%
  subset(SubID == 5006) %>% 
  filter(SleepDate %in% MRI_date$PreDate)

Выше часто возвращаются все данные 5006 ID

SleepData %>%
  subset(SubID == 5006) %>% 
  subset(SleepDate == MRI_date$PreDate)

, которые возвращают:

longer object length is not a multiple of shorter object lengthLength of logical index must be 1 or 31, not 44Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE,  : 
  arguments imply differing number of rows: 0, 1

что япытаюсь извлечь

Исходя из этого, например:

If ID == 5009 & (Date == 5/9/2018 & 6/11/2018)

Я хотел бы получить данные сна соответственно:

SubID   SleepDate   Day of Week RHR HRV Recovery
5009    5/9/2018    'Wednesday' 46  176 75
5009    6/11/2018   'Wednesday' 76  196 95

[Я составил 6/ 11/2018 для справки]

Ответы [ 3 ]

0 голосов
/ 04 апреля 2019

Если вы хотите получить данные о спящем режиме для каждой PreDate и каждой PostDate, вам будет проще собрать эти две даты в один столбец и отследить, какая это дата в другом столбце.Затем вы можете выполнить объединение, чтобы получить все данные о сне, соответствующие этому идентификатору и этой дате.

library(tidyverse)
MRI_date %>%
  gather(status, SleepDate, c(PreDate, PostDate)) %>%
  left_join(SleepData, by = c("ID" = "SubID", "SleepDate"))

#Joining, by = "SleepDate"
#     ID prescan Postscan   status  SleepDate Day_of_Week RHR HRV Recovery
#1  5006       1        1  PreDate 2018-05-10        <NA>  NA  NA       NA
#2  5007       1        1  PreDate 2018-05-15        <NA>  NA  NA       NA
#3  5009       1        1  PreDate 2018-05-09   Wednesday  46 176       75
#4  5011       1        1  PreDate 2018-05-31        <NA>  NA  NA       NA
#5  5013       1        1  PreDate 2018-05-30        <NA>  NA  NA       NA
#6  5006       1        1 PostDate 2018-06-14        <NA>  NA  NA       NA
#7  5007       1        1 PostDate 2018-06-13        <NA>  NA  NA       NA
#8  5009       1        1 PostDate 2018-06-11        <NA>  NA  NA       NA
#9  5011       1        1 PostDate 2018-07-02        <NA>  NA  NA       NA
#10 5013       1        1 PostDate 2018-07-05        <NA>  NA  NA       NA

Исходные данные:

library(dplyr)
MRI_date <- read.table(
  header = T, 
  stringsAsFactors = F, colClasses = c("integer", "integer", "character", "integer", "character"),
  text = "ID prescan PreDate Postscan    PostDate
5006    1   5/10/2018   1   6/14/2018
5007    1   5/15/2018   1   6/13/2018
5009    1   5/9/2018    1   6/11/2018
5011    1   5/31/2018   1   7/2/2018
5013    1   5/30/2018   1   7/5/2018") %>%
  mutate_if(is.character, lubridate::mdy)


SleepData <- df <- read.table(
  header = T, 
  stringsAsFactors = F, 
  text = "SubID   SleepDate   Day_of_Week RHR HRV Recovery
5007    5/12/2018   'Saturday ' 63  95  65
5007    5/13/2018   'Sunday   ' 66  72  52
5010    5/7/2018    'Monday   ' 74  40  48
5010    5/8/2018    'Tuesday  ' 68  67  59
5010    5/9/2018    'Wednesday' 75  74  82
5010    5/10/2018   'Thursday ' 71  80  89
5010    5/11/2018   'Friday   ' 71  91  95
5010    5/12/2018   'Saturday ' 68  66  58
5008    5/7/2018    'Monday   ' 60  132 85
5008    5/8/2018    'Tuesday  ' 60  123 90
5008    5/9/2018    'Wednesday' 66  105 68
5009    5/7/2018    'Monday   ' 47  148 90
5009    5/8/2018    'Tuesday  ' 45  169 87
5009    5/9/2018    'Wednesday' 46  176 75
5009    5/10/2018   'Thursday ' 50  138 54
5009    5/11/2018   'Friday   ' 46  132 42
5009    5/12/2018   'Saturday ' 47  158 60
5009    5/13/2018   'Sunday   ' 47  141 54
5006    5/7/2018    'Monday   ' 56  92  65")
SleepData <- SleepData %>% mutate(SleepDate = lubridate::mdy(SleepDate))
0 голосов
/ 04 апреля 2019

Вы можете использовать функцию слияния:

    pre <- subset(merge(SleepData, MRI_date, by.x = c("SubID", "SleepDate"), by.y = c("ID", "PreDate")), TRUE, select = c(SubID:Recovery))
    post <- subset(merge(SleepData, MRI_date, by.x = c("SubID", "SleepDate"), by.y = c("ID", "PostDate")), TRUE, select = (SubID:Recovery))
    result <- rbind(pre, post)

Функция подмножества используется только для выбора соответствующих столбцов из SleepData после функции слияния с аргументом select = - она ​​не удаляет строки.Это гарантирует, что rbind получает только два фрейма данных с одинаковыми столбцами в качестве аргументов

0 голосов
/ 04 апреля 2019

Попробуйте что-то вроде этого.

library(dplyr)

sleep.dat %>%
 inner_join(mri.dat, by = c("Id" = "subId") %>%
 select(Id == "5009") %>%
 mutate(Date = as.Date(Date, "%m/%d/%Y")) %>%
 filter(Date >= as.Date("5-9-2018") & Date <= as.Date("6-11-2018")) %>%
 select(Id, SleepDate, `Day of Week`, RHR, HRV, Recovery)
...