如果存在 1 的虚拟,则删除 0 的虚拟。但如果没有虚拟 1,则保留 0,对于两列

问题描述 投票:0回答:1

数据集如下:

a  b  c d
a1 b1 1 0 
a1 b1 0 1
a1 b2 0 1
a1 b2 1 0

a2 b3 1 0 
a2 b3 1 0
a2 b4 0 0

如果 a1 和 b1 为一对,则 c 列的虚拟值为 1 和 0,d 列的虚拟值为 0 和 1。我希望每列中的每一对都有最大的虚拟值。

输出应该是:

a  b  c d
a1 b1 1 1
a1 b2 1 1
a2 b3 1 0
a2 b4 0 0

我尝试了函数“slice_max(c, by (c(a,b))”,但它每次只能执行一列,如果我先将它用于 c 列,则对于 a1&b1 对,第 2&3 列将被删除, d 将仅为 0。

rstudio dummy-variable
1个回答
0
投票

这是

summarize()
包中的
dplyr
的一个很好的案例。

这是采用

a
参数中描述的每对
b
.by
,并找到
c
的最大值和
d
的最大值。

data <- tibble::tibble(
    a = c("a1", "a1", "a1", "a1", "a2", "a2", "a2"),
    b = c("b1", "b1", "b2", "b2", "b3", "b3", "b4"),
    c = c(   1,    0,    0,    1,    1,    1,    0),
    d = c(   0,    1,    1,    0,    0,    0,    0)
)

data
#> # A tibble: 7 × 4
#>   a     b         c     d
#>   <chr> <chr> <dbl> <dbl>
#> 1 a1    b1        1     0
#> 2 a1    b1        0     1
#> 3 a1    b2        0     1
#> 4 a1    b2        1     0
#> 5 a2    b3        1     0
#> 6 a2    b3        1     0
#> 7 a2    b4        0     0

data |> dplyr::summarize(
    c = max(c),
    d = max(d),
    .by = c(a, b)
)
#> # A tibble: 4 × 4
#>   a     b         c     d
#>   <chr> <chr> <dbl> <dbl>
#> 1 a1    b1        1     1
#> 2 a1    b2        1     1
#> 3 a2    b3        1     0
#> 4 a2    b4        0     0
© www.soinside.com 2019 - 2024. All rights reserved.