2017-03-17 8 views
0

단정 한 tibble 만들 dplyr 사용 방법 :이벤트의 여러 인스턴스를 수집하고 나는이 유사한 데이터 세트가

library(tidyverse) 

df <- tibble(
    subjid = 1:5, 
    event_1 = c("Watery eyes",   # Event number 1 
      "Sore throat", 
      "Vomiting", 
      "Gastroenteritis viral", 
      "Dry Mouth"), 
    start_date_1 = as.Date("2017-01-02") + 0:4, 
    stop_date_1 = as.Date("2017-01-03") + 0:4, 
    severity_1 = 1, 
    related_to_drug_1 = 0, 
    event_2 = c("Nausea",    # Event number 2 
      "Dizziness", 
      "Cough", 
      "Disorientation", 
      "Diarrhea"), 
    start_date_2 = as.Date("2017-02-02") + 0:4, 
    stop_date_2 = as.Date("2017-02-03") + 0:4, 
    severity_2 = 2, 
    related_to_drug_2 = 1, 
    event_3 = c("Eczema",    # Event number 3 
      "Sinusitis", 
      "Abdominal discomfort", 
      "Muscle spasms", 
      "Nasopharyngitis"), 
    start_date_3 = as.Date("2017-03-02") + 0:4, 
    stop_date_3 = as.Date("2017-03-03") + 0:4, 
    severity_3 = 2, 
    related_to_drug_3 = 1 
) 
df 

# A tibble: 5 × 16 
    subjid    event_1 start_date_1 stop_date_1 severity_1 related_to_drug_1  event_2 start_date_2 stop_date_2 severity_2 related_to_drug_2    event_3 
    <int>     <chr>  <date>  <date>  <dbl>    <dbl>   <chr>  <date>  <date>  <dbl>    <dbl>    <chr> 
1  1   Watery eyes 2017-01-02 2017-01-03   1     0   Nausea 2017-02-02 2017-02-03   2     1    Eczema 
2  2   Sore throat 2017-01-03 2017-01-04   1     0  Dizziness 2017-02-03 2017-02-04   2     1   Sinusitis 
3  3    Vomiting 2017-01-04 2017-01-05   1     0   Cough 2017-02-04 2017-02-05   2     1 Abdominal discomfort 
4  4 Gastroenteritis viral 2017-01-05 2017-01-06   1     0 Disorientation 2017-02-05 2017-02-06   2     1  Muscle spasms 
5  5    Dry Mouth 2017-01-06 2017-01-07   1     0  Diarrhea 2017-02-06 2017-02-07   2     1  Nasopharyngitis 
# ... with 4 more variables: start_date_3 <date>, stop_date_3 <date>, severity_3 <dbl>, related_to_drug_3 <dbl> 

그러나, 데이터의 100 "이벤트"를 통해 더 많은 행이를/일련의 열. 데이터 프레임은 부작용 및 부작용이있는 각 주제에 대한 행으로 구성되며, 해당 속성은 밑줄로 명명 된 열에 나열되어 어떤 이벤트가 속해 있는지 나타냅니다. 이것은 각각의 부작용에 대해 하나 개의 행을 것

# A tibble: 15 × 7 
    subjid event_number     event start_date stop_date severity related_to_drug 
    <int>  <int>     <chr>  <date>  <date> <int>    <int> 
1  1   1   Watery eyes 2017-01-02 2017-01-03  1     0 
2  2   1   Sore throat 2017-01-03 2017-01-04  1     0 
3  3   1    Vomiting 2017-01-04 2017-01-05  1     0 
4  4   1 Gastroenteritis viral 2017-01-05 2017-01-06  1     0 
5  5   1    Dry Mouth 2017-01-06 2017-01-07  1     0 
6  1   2    Nausea 2017-02-02 2017-02-03  2     1 
7  2   2    Dizziness 2017-02-03 2017-02-04  2     1 
8  3   2     Cough 2017-02-04 2017-02-05  2     1 
9  4   2  Disorientation 2017-02-05 2017-02-06  2     1 
10  5   2    Diarrhea 2017-02-06 2017-02-07  2     1 
11  1   3    Eczema 2017-03-02 2017-03-03  3     2 
12  2   3    Sinusitis 2017-03-03 2017-03-04  3     2 
13  3   3 Abdominal discomfort 2017-03-04 2017-03-05  3     2 
14  4   3   Muscle spasms 2017-03-05 2017-03-06  3     2 
15  5   3  Nasopharyngitis 2017-03-06 2017-03-07  3     2 

하고, 열은 특정 이벤트에 대한 특성을 식별 : I는 같은 tibble에 이러한 이벤트를 수집하기 위해 tidyr 사용하고 싶습니다.

답변

1

다음과 같은 코드를 사용하여이 작업을 수행 할 수 있습니다

df %>% 
    gather(Var,Val,-1) %>% 
    mutate(Var = gsub('_(\\d+)','!!\\1',Var)) %>% 
    separate(Var,c('Var','Event'),sep = '!!') %>% 
    spread(Var,Val) 

불행하게도이 컬럼의 클래스를 파괴 할 것이다, 그리고 당신이 mutate를 호출 할 수있는 고정해야합니다.

(또한 후 수집 mutate 라인은 당신이 당신의 COL 이름에 '_'하고 난 이벤트 번호를 분할 할 이유만으로되어 있습니다.)

+0

감사합니다; 이것은 내가 필요한 것입니다! 나는 추가했다 : %돌연변이 (start_date = as_date (as.numeric (start_date))) %> % mutate (stop_date = as_date (as.numeric (stop_date))) 그리고 필요에 따라 작동한다. 다시 한 번 감사드립니다 !!!! – jsly

+0

@jsly dplyr tip : 'mutate'를 한 번 호출하면 여러 변경 사항을 적용 할 수 있습니다. 예를 들면 : mutate (A = as_date (A), B = as_date (B)). 적절한 들여 쓰기를 사용하면 덜 복잡해질 수 있습니다. (또는 더 많이) –

1

그것을 할 수있는 더 복잡한 방법이 있지만, , 매우 중요한 것은 은 클래스을 보존합니다. 열 이름
시작, 다음 이벤트 당 하나의 dataframe을, 그리고 마지막으로 수직으로 쌓아 이벤트 수에 따라 그들을 분할 :

names(df) %>% 
    setdiff("subjid") %>% 
    split(sub(".*_(\\d+)$", "\\1", x = .)) %>% 
    map(~ select_(.data = df, .dots = c("subjid", .x))) %>% 
    map(~ setNames(.x, nm = sub("(.*)_\\d+$", "\\1", x = names(.x)))) %>% 
    map2(names(.), ~ mutate(.x, event_number = .y)) %>% 
    bind_rows() %>% 
    select(subjid, event_number, everything()) 
# # A tibble: 15 × 7 
# subjid event_number     event start_date stop_date severity related_to_drug 
#  <int>  <chr>     <chr>  <date>  <date> <dbl>   <dbl> 
# 1  1   1   Watery eyes 2017-01-02 2017-01-03  1    0 
# 2  2   1   Sore throat 2017-01-03 2017-01-04  1    0 
# 3  3   1    Vomiting 2017-01-04 2017-01-05  1    0 
# 4  4   1 Gastroenteritis viral 2017-01-05 2017-01-06  1    0 
# 5  5   1    Dry Mouth 2017-01-06 2017-01-07  1    0 
# 6  1   2    Nausea 2017-02-02 2017-02-03  2    1 
# 7  2   2    Dizziness 2017-02-03 2017-02-04  2    1 
# 8  3   2     Cough 2017-02-04 2017-02-05  2    1 
# 9  4   2  Disorientation 2017-02-05 2017-02-06  2    1 
# 10  5   2    Diarrhea 2017-02-06 2017-02-07  2    1 
# 11  1   3    Eczema 2017-03-02 2017-03-03  2    1 
# 12  2   3    Sinusitis 2017-03-03 2017-03-04  2    1 
# 13  3   3 Abdominal discomfort 2017-03-04 2017-03-05  2    1 
# 14  4   3   Muscle spasms 2017-03-05 2017-03-06  2    1 
# 15  5   3  Nasopharyngitis 2017-03-06 2017-03-07  2    1