簡體   English   中英

R - 通過匹配值對行進行分組,然后將行添加到另一個數據框中的匹配列

[英]R - Grouping rows by matching value then adding rows to matching columns in another data frame

我正在嘗試基於兩個不同的列將一個數據框(ex2)中的值添加到現有數據框(ex1)。 如您所見,兩個數據框中都有一個 ID 列。 但是在 ex2 中,ex1 的每一列都由不同的行而不是列表示。 對於每個匹配的 ID,我想將 ex2$result 的結果添加到 ex1 中相應列標題下的匹配行(如果 ex2$alpha[i] = a 那么 ex2$result[i] 被添加到 ex1$a[ z] 其中 ex2$id[i]=ex1$id[z])。 另一個復雜因素是,並非 ex1 中的所有列在 ex2 中都具有 alpha 值,因此應將它們設置為“NA”。

ex1 <- data.frame(
  id = c(1:20),
  a = c(rep(1,5),rep(0,5),rep(NA,10)),
  b = c(rep(c(1,0),5),rep(NA,10)),
  c = c(rep(c(0,1),5),rep(NA,10)),
  d = c(rep(0,5),rep(1,5),rep(NA,10))
)

ex2 <- data.frame(
  id = c(rep(11,3),rep(12,3),rep(13,3),
         rep(14,2),rep(15,2),
         rep(16,4),rep(17,4),rep(18,4),rep(19,4),rep(20,4)),
  alpha = c(rep(c('a','b','d'),3),rep(c('a','b'),2),
rep(c('a','b','c','d'),5)),
  result = c(rep(c(0,1,1),11))
)

謝謝你的幫助!

我相信附加的代碼片段可以滿足您的要求。 但是從你的玩具數據中很難知道在 mutate 語句中寫出 a 到 d 列是否可行。 肯定有一種更聰明的編程方式來解決這個問題。

ex1 <- data.frame(
    id = c(1:20),
    a = c(rep(1,5),rep(0,5),rep(NA,10)),
    b = c(rep(c(1,0),5),rep(NA,10)),
    c = c(rep(c(0,1),5),rep(NA,10)),
    d = c(rep(0,5),rep(1,5),rep(NA,10))
)

ex2 <- data.frame(
    id = c(rep(11,3),rep(12,3),rep(13,3),
          rep(14,2),rep(15,2),
          rep(16,4),rep(17,4),rep(18,4),rep(19,4),rep(20,4)),
    alpha = c(rep(c('a','b','d'),3),rep(c('a','b'),2),
            rep(c('a','b','c','d'),5)),
    result = c(rep(c(0,1,1),11))
)

library(tidyverse)
ex_2_wide <- pivot_wider(ex2, id_cols = id, names_from = alpha, values_from = result  )

joined <- full_join(ex1, ex_2_wide, by = c("id" = "id")) %>%
    mutate(a = coalesce(a.x, a.y)) %>%
    mutate(b = coalesce(b.x, b.y)) %>%
    mutate(c = coalesce(c.x, c.y)) %>%
    mutate(d = coalesce(d.x, d.y)) %>%
    select(-(a.x:c.y))

joined
#>    id a b  c  d
#> 1   1 1 1  0  0
#> 2   2 1 0  1  0
#> 3   3 1 1  0  0
#> 4   4 1 0  1  0
#> 5   5 1 1  0  0
#> 6   6 0 0  1  1
#> 7   7 0 1  0  1
#> 8   8 0 0  1  1
#> 9   9 0 1  0  1
#> 10 10 0 0  1  1
#> 11 11 0 1 NA  1
#> 12 12 0 1 NA  1
#> 13 13 0 1 NA  1
#> 14 14 0 1 NA NA
#> 15 15 1 0 NA NA
#> 16 16 1 1  0  1
#> 17 17 1 0  1  1
#> 18 18 0 1  1  0
#> 19 19 1 1  0  1
#> 20 20 1 0  1  1

代表 package (v0.3.0) 於 2021 年 1 月 7 日創建

編輯:

如果我們把問題轉過來(我們先做長表,然后連接和合並,然后 pivot 回寬),合並只有一步,不管你有多少列。

library(tidyverse)

ex1_long <- pivot_longer(ex1, cols = a:d, names_to = "alpha")                                           

joined <- full_join(ex1_long, ex2, by = c("id" = "id", "alpha" = "alpha")) %>%
    mutate(value = coalesce(value, result)) %>% select(-result) %>%
    pivot_wider(id_cols = id, names_from = alpha, values_from = value)

joined
#> # A tibble: 20 x 5
#>       id     a     b     c     d
#>    <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1     1     1     1     0     0
#>  2     2     1     0     1     0
#>  3     3     1     1     0     0
#>  4     4     1     0     1     0
#>  5     5     1     1     0     0
#>  6     6     0     0     1     1
#>  7     7     0     1     0     1
#>  8     8     0     0     1     1
#>  9     9     0     1     0     1
#> 10    10     0     0     1     1
#> 11    11     0     1    NA     1
#> 12    12     0     1    NA     1
#> 13    13     0     1    NA     1
#> 14    14     0     1    NA    NA
#> 15    15     1     0    NA    NA
#> 16    16     1     1     0     1
#> 17    17     1     0     1     1
#> 18    18     0     1     1     0
#> 19    19     1     1     0     1
#> 20    20     1     0     1     1

代表 package (v0.3.0) 於 2021 年 1 月 7 日創建

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM