dplyr :: coalesce、ただし複数行の場合

Aug 21 2020

いくつかのメタデータとさまざまな測定値のセットを含むデータフレームのリストを出力するコードがいくつかあります。メタデータが同じである単一の行にNA値を「押しつぶす」ことにより、データフレームのリストを処理し、単一のデータフレームを返すことができる必要があります。できればdplyr関数を使いたいです。

複数のタイプの結合、bind_rows、bind_cols(次に重複を削除)、合体関数(有望に見えましたが、複数ではなく1つの行でのみ機能します)を試しました。

データ入力は非常に可変であり、測定数が異なります。

私が始めているものの例:

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(.)))