R语言实现dataframe按分类变量水平重复行并生成dummy变量
R语言实现需求的简便方法
你需要的操作可以通过扩展原数据行数+生成哑变量两步完成,以下给出两种常用实现方案:
方案1:base R 实现(无需加载额外包)
# 构造示例数据,你可以替换为自己的dataframe df <- data.frame( id = 1:3, A = c(2, 2, 1), B = c(1, 1, 1), C = c(3, 1, 3) ) # 1. 计算A的水平总数p p <- length(unique(df$A)) # 2. 把原数据每一行重复p次,得到扩展后的数据框 df_result <- df[rep(seq_len(nrow(df)), each = p), ] # 3. 替换A列为哑变量:对应原A水平的行取1,其余取0 df_result$A <- as.integer(rep(1:p, nrow(df)) == df_result$A)
方案2:tidyverse 实现(代码可读性更高)
# 加载包 library(tidyverse) # 构造示例数据 df <- tibble( id = 1:3, A = c(2, 2, 1), B = c(1, 1, 1), C = c(3, 1, 3) ) p <- length(unique(df$A)) df_result <- df %>% # 按id分组,每行扩展为p行 reframe( A = as.integer(1:p == A), B = B, C = C, .by = id )
两种方案输出的结果都和你给出的目标格式一致。如果你的A变量水平不是连续的1:p,只需要把代码里的1:p替换为sort(unique(df$A))即可适配所有情况。
内容的提问来源于stack exchange,提问作者kjakeb
相关产品推荐
相关产品推荐

