基于R数据集中的列索引替换列中的值

5ktev3wc  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(108)

我有一个数据集,其中包含多列(全部用零填充)和一个数字索引列。现在我想替换与列索引匹配的列中的零(1 =第一列,2 =第二列...)简化示例:

input <- tibble(X1 = c(0,0,0,0), X2 = c(0,0,0,0), X3 = c(0,0,0,0), index = c(1,2,2,3))
output <- tibble(X1 = c(1,0,0,0), X2 = c(0,1,1,0), X3 = c(0,0,0,1), index = c(1,2,2,3))

我已经找到了一个解决方案,但我很好奇是否有更好/更简单的方法来编写它(也许是以R为基数)。

input %>% 
    select(index) %>% 
    bind_cols(map2_dfc(.x = c('X1', 'X2', 'X3'),
    .y = 1:3,
    .f = ~input %>%
    transmute(!!sym(.x) := if_else(.y == index, 1, 0))))`
rwqw0loc

rwqw0loc1#

如果使用data.frames和底数R,则可以执行以下操作

input <- as.data.frame(input)
input[cbind(seq_along(input$index), input$index)] <- 1
input
r1wp621o

r1wp621o2#

input[1:3] <- model.matrix(~factor(index)+0, input)

input
# A tibble: 4 × 4
     X1    X2    X3 index
  <dbl> <dbl> <dbl> <dbl>
1     1     0     0     1
2     0     1     0     2
3     0     1     0     2
4     0     0     1     3
2w2cym1i

2w2cym1i3#

下面是使用map2_dfc的方法

input %>% mutate(map2_dfc(.x=across(starts_with('X')), 
.y=seq_along(1: (length(.)-1)), .f= ~ ifelse(index==.y, 1, 0)))

创建于2023年1月25日,使用reprex v2.0.2

# A tibble: 4 × 4
     X1    X2    X3 index
  <dbl> <dbl> <dbl> <dbl>
1     1     0     0     1
2     0     1     0     2
3     0     1     0     2
4     0     0     1     3

相关问题