在R中的数据框操作 - 根据行值编号为第n行赋值

4

我有一个示例数据框“df”:

id <- c(1001, 1002)
col2 <- c(5, 2)
col3 <- c(1, 4)
df <- data.frame(id, col2, col3)

有没有一种简单的方法将此数据框转换为新数据框,使得新数据框包含相同的列名,但将“1”分配给对应于每个值的第n行,并将“0”分配给其余插槽?这似乎是可行的,但有些困难。结果表格将如下所示(df_results):

id <- c(rep(1001, 5), rep(1002, 5))
col2 <- c(0,0,0,0,1, 0,1,0,0,0)
col3 <- c(1,0,0,0,0,0,0,0,1,0)
df_results <- data.frame(id, col2, col3)
1个回答

3
您可以使用列的并行最大值进行uncount(),然后按id分组,检查该值是否等于行号:
library(dplyr)
library(tidyr)

df %>%
  uncount(pmax(col2, col3)) %>%
  group_by(id) %>%
  mutate(across(starts_with("col"), ~ as.numeric(.x == row_number()))) %>%
  ungroup()

# A tibble: 9 × 3
     id  col2  col3
  <dbl> <dbl> <dbl>
1  1001     0     1
2  1001     0     0
3  1001     0     0
4  1001     0     0
5  1001     1     0
6  1002     0     0
7  1002     1     0
8  1002     0     0
9  1002     0     1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接