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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:10:29