如何在R语言中基于指定列数值生成顺序填充的多列结果
R实现按行顺序生成多列填充宽表
首先构造你给出的原始输入数据:
df <- data.frame( Person = c("John", "Michael", "Florence"), Task = c(4, 1, 3) )
方法1:基础R实现
# 定义需要生成的新列总数 total_col <- 8 # 初始化全0矩阵,列名为1~8 fill_mat <- matrix(0, nrow = nrow(df), ncol = total_col, dimnames = list(NULL, as.character(1:total_col))) # 计算每行填充1的起始位置 start_idx <- cumsum(c(1, head(df$Task, -1))) # 逐行填充对应位置为1 for (i in seq_len(nrow(df))) { fill_range <- start_idx[i]:(start_idx[i] + df$Task[i] - 1) fill_mat[i, fill_range] <- 1 } # 合并原数据和填充矩阵得到最终结果 result <- cbind(df, fill_mat)
方法2:tidyverse生态实现
library(dplyr) library(purrr) library(tidyr) total_col <- 8 result <- df %>% mutate( # 计算每行填充的起始、结束位置 start = cumsum(lag(Task, default = 0)) + 1, end = start + Task - 1, # 生成每行需要标记为1的列编号 fill_cols = map2(start, end, ~.x:min(.y, total_col)) ) %>% unnest_longer(fill_cols, keep_empty = TRUE) %>% mutate(value = 1, fill_cols = as.character(fill_cols)) %>% # 转为宽表,缺失位置填充0 pivot_wider(names_from = fill_cols, values_from = value, values_fill = 0) %>% # 调整列顺序,补全所有1~8列 select(Person, Task, all_of(as.character(1:total_col)))
打印输出result即可得到你需要的结果:
Person Task 1 2 3 4 5 6 7 8 1 John 4 1 1 1 1 0 0 0 0 2 Michael 1 0 0 0 0 1 0 0 0 3 Florence 3 0 0 0 0 0 1 1 1
内容的提问来源于stack exchange,提问作者Clara
相关产品推荐
相关产品推荐

