如何在R中基于多个二元变量批量生成仅含指定连续变量的子样本?
R语言批量生成对应二元变量为1的子样本
先还原你的数据框:
df <- data.frame(a= c(1,1,2,3,5), b = c(3, 6,8, 2, 4), v1 = c(0,0,0,0,0), v2 = c(1,0,0,0,0), v3 = c(0,1,1,1,1), v4 = c(0,1,1,1,1), v5 = c(0,0,0,0,1), v6 = c(0,0,0,0,0), v7 = c(0,0,0,0,0))
需求:基于上述数据框,批量生成7个子样本,每个子样本仅保留a、b列,分别对应v1=1、v2=1……v7=1的行。
以下是几种批量实现的方法:
方法一:基础R循环实现
逻辑清晰,适合习惯基础R语法的场景:
# 定义所有v开头的列名 v_cols <- paste0("v", 1:7) # 创建空列表存储子样本 sub_samples <- list() # 循环遍历每个v列,筛选对应行并提取a、b for (col in v_cols) { sub_samples[[col]] <- df[df[[col]] == 1, c("a", "b")] }
生成的sub_samples是一个列表,每个元素对应一个子样本,比如sub_samples$v2就是v2=1对应的a、b数据,sub_samples$v1会是空数据框(因为v1全为0)。
方法二:tidyverse风格(purrr包)
如果常用tidyverse工具链,用purrr::map可以更简洁:
library(purrr) v_cols <- paste0("v", 1:7) # 遍历列名生成子样本,最后给列表命名 sub_samples <- map(v_cols, ~ df[df[[.x]] == 1, c("a", "b")]) names(sub_samples) <- v_cols
方法三:长格式拆分法(reshape2包)
通过宽转长格式后拆分,适合需要后续做更多长格式处理的场景:
library(reshape2) # 转换为长格式,保留a、b作为标识列 df_long <- melt(df, id.vars = c("a", "b"), variable.name = "v_var", value.name = "value") # 筛选value=1的行,再按v_var拆分得到子样本 sub_samples <- split(df_long[df_long$value == 1, c("a", "b")], df_long$v_var[df_long$value == 1])
注意:这种方法不会生成对应全0列的空数据框,只会保留有符合条件行的子样本。
可选:将子样本导出为全局环境变量
如果需要把每个子样本单独作为全局环境的变量(不推荐,列表管理更整洁),可以执行:
list2env(sub_samples, .GlobalEnv)
执行后全局环境会出现v1、v2……v7的数据框变量。
内容的提问来源于stack exchange,提问作者zjppdozen
相关产品推荐
相关产品推荐

