You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 01:45:03