如何在R语言中展开数据行并按条件填充新列?
解决方案:展开感染率数据框为个体级记录
需求说明
将包含采样个体数、感染个体数的数据框展开,使每一行对应一个采样个体,新增Infected列(1表示感染,0表示未感染)。
原始数据
df <- data.frame(Site_Number = c(1, 1, 1, 2), Population = c(100, 200, 300, 100), Number_Sampled = c(6, 3, 6, 4), Number_Infected = c(0, 1, 5, 1))
方法一:使用tidyverse工具链
通过map2构造每行对应的感染状态向量,再用unnest展开数据框:
library(tidyverse) df_expanded <- df %>% # 为每行生成Infected向量:Number_Infected个1,剩余为0 mutate(Infected = map2(Number_Infected, Number_Sampled, ~c(rep(1, .x), rep(0, .y - .x)))) %>% # 展开向量为多行 unnest(Infected) %>% # 移除不需要的原始列 select(-Number_Sampled, -Number_Infected) # 查看结果 print(df_expanded)
方法二:使用Base R实现
通过lapply遍历每行生成子数据框,再合并为最终结果:
# 遍历每行生成对应个体记录 rows_list <- lapply(1:nrow(df), function(i) { n_infected <- df$Number_Infected[i] n_sampled <- df$Number_Sampled[i] data.frame( Site_Number = df$Site_Number[i], Population = df$Population[i], Infected = c(rep(1, n_infected), rep(0, n_sampled - n_infected)) ) }) # 合并所有子数据框 df_expanded <- do.call(rbind, rows_list) # 查看结果 print(df_expanded)
两种方法都能得到期望的个体级数据结构,其中tidyverse方法更简洁,Base R方法无需额外安装包。
内容的提问来源于stack exchange,提问作者Abby L
相关产品推荐
相关产品推荐

