微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R - 通过匹配值对行进行分组,然后将行添加到另一个数据框中的匹配列

如何解决R - 通过匹配值对行进行分组,然后将行添加到另一个数据框中的匹配列

我正在尝试将一个数据框 (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,rep(NA,10)),b = c(rep(c(1,0),c = c(rep(c(0,1),d = c(rep(0,rep(1,10))
)

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

感谢您的帮助!

解决方法

我相信附加的代码段可以满足您的需求。但是很难从你的玩具数据中知道在 mutate 语句中写出 a 到 d 列是否可行。肯定有更聪明的编程方式来解决这个问题。

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

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

reprex package (v0.3.0) 于 2021 年 1 月 7 日创建

编辑:

如果我们扭转这个问题(我们首先制作长表,然后连接和合并,然后向后旋转),那么合并只需一步,无论您有多少列。

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,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

reprex package (v0.3.0) 于 2021 年 1 月 7 日创建

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。