dplyr :: coalesce, 그러나 여러 행의 경우

Aug 21 2020

일부 메타 데이터와 다른 측정 세트를 포함하는 데이터 프레임 목록을 출력하는 코드가 있습니다. NA 값을 메타 데이터가 동일한 단일 행으로 '스 쿼싱'하여 데이터 프레임 목록을 처리하고 단일 데이터 프레임을 반환 할 수 있어야합니다. 가능하면 dplyr 함수를 사용하고 싶습니다.

여러 유형의 조인, bind_rows, bind_cols (그런 다음 중복 제거), 병합 함수 (유망 해 보이지만 여러 행에 대해서만 작동합니다.

데이터 입력은 측정 횟수가 다른 매우 가변적입니다.

내가 시작하는 것의 예 :

dfs <- list(
  df1 = tibble(
    exp = "EXP1",
    stage = "Stage1",
    section = rep(101:105, each = 2),
    meas1 = c(29L, 30L, 20L, 23L, 25L, 28L, 21L, 26L, 24L, 22L)
  ),
  df2 = tibble(
    exp = "EXP1",
    stage = "Stage1",
    section = 101:105,
    meas2 = 30:34
  ),
  df3 = tibble(
    exp = "EXP1",
    stage = "Stage2",
    section = 101:105,
    meas2 = 40:44
  )
)

$df1 # A tibble: 10 x 4 exp stage section meas1 <chr> <chr> <int> <int> 1 EXP1 Stage1 101 29 2 EXP1 Stage1 101 30 3 EXP1 Stage1 102 20 4 EXP1 Stage1 102 23 5 EXP1 Stage1 103 25 6 EXP1 Stage1 103 28 7 EXP1 Stage1 104 21 8 EXP1 Stage1 104 26 9 EXP1 Stage1 105 24 10 EXP1 Stage1 105 22 $df2
# A tibble: 5 x 4
  exp   stage  section meas2
  <chr> <chr>    <int> <int>
1 EXP1  Stage1     101    30
2 EXP1  Stage1     102    31
3 EXP1  Stage1     103    32
4 EXP1  Stage1     104    33
5 EXP1  Stage1     105    34

$df3
# A tibble: 5 x 4
  exp   stage  section meas2
  <chr> <chr>    <int> <int>
1 EXP1  Stage2     101    40
2 EXP1  Stage2     102    41
3 EXP1  Stage2     103    42
4 EXP1  Stage2     104    43
5 EXP1  Stage2     105    44

내가 끝내고 싶은 것의 예 :

    result <- tibble(
  exp = "EXP1",
  stage = c(rep('Stage1', 10), rep('Stage2', 5)),
  section = c(rep(101:105, each = 2), 101:105),
  meas1 = c(c(29L, 30L, 20L, 23L, 25L, 28L, 21L, 26L, 24L, 22L), rep(NA_real_, 5)),
  meas2 = c(30, NA_real_, 31, NA_real_, 32, NA_real_, 33, NA_real_, 34, NA_real_, 40:44)
)



 # A tibble: 15 x 5
   exp   stage  section meas1 meas2
   <chr> <chr>    <int> <dbl> <dbl>
 1 EXP1  Stage1     101    29    30
 2 EXP1  Stage1     101    30    NA
 3 EXP1  Stage1     102    20    31
 4 EXP1  Stage1     102    23    NA
 5 EXP1  Stage1     103    25    32
 6 EXP1  Stage1     103    28    NA
 7 EXP1  Stage1     104    21    33
 8 EXP1  Stage1     104    26    NA
 9 EXP1  Stage1     105    24    34
10 EXP1  Stage1     105    22    NA
11 EXP1  Stage2     101    NA    40
12 EXP1  Stage2     102    NA    41
13 EXP1  Stage2     103    NA    42
14 EXP1  Stage2     104    NA    43
15 EXP1  Stage2     105    NA    44

도움을 주셔서 감사합니다. 몇 년간의 R 프로그래밍 후, 이것이 SO에 대한 첫 번째 질문입니다. 나는 항상 SO를 사용하여 알아낼 수있었습니다.

답변

1 akrun Aug 21 2020 at 03:43

요소 bind_rows를 바인딩하는 데 사용할 수 list있으며 작업별로 그룹을 수행 할 수 있습니다.

library(dplyr)
bind_rows(dfs) %>% 
    group_by(exp, stage, section) %>% 
    summarise(across(everything(), ~ if(all(is.na(.))) NA_integer_ 
        else na.omit(.)))