使用循环生成指定命名的模拟数据框问题求助
问题描述
需要循环生成三个DataFrame:h00_2000、h10_2000、s00_2000,命名前缀分别对应h00_、h10_、s00_。每个DataFrame需包含3列、5条观测:
- 以对应前缀开头的
city列(如h00_city):随机字符串 - 以对应前缀开头的
race列(如h00_race):取值为1或2 id列:随机数字串
最初尝试的代码无法正常运行,也无法给指定DataFrame命名赋值:
for(x in c("h00_", "h10_", "s00_")){ paste0(x, "city") <- do.call(paste0, replicate(5, sample(LETTERS, 50, TRUE), FALSE)) paste0(x, "race") <- do.call(paste0, replicate(1, sample(1:2, 50, TRUE), FALSE)) id <- do.call(paste0, replicate(5, sample(0:9, 50, TRUE), FALSE)) }
更新后的代码仍无法正确设置前两列的列名,列名显示为assign.paste0.x...city....do.call.paste0..replicate.5..sample.LETTERS.这类无效内容:
for(x in c("h00_", "h10_", "s00_")){ assign(paste0(x, "2000"), data.frame( assign(paste0(x,"city"), do.call(paste0, replicate(5, sample(LETTERS, 50, TRUE), FALSE))), assign(paste0(x,"race"), do.call(paste0, replicate(1, sample(1:2, 50, TRUE), FALSE))), id = do.call(paste0, replicate(5, sample(0:9, 50, TRUE), FALSE)))) }
解决方案
问题核心是你把assign()直接作为data.frame()的列参数,导致列名被自动设为assign()的调用表达式文本,而非预期的前缀格式。同时原代码生成了50条观测,不符合需求的5条。
以下是两种可行的修正方案:
方案1:使用动态列名语法(R 4.0+推荐)
for(prefix in c("h00_", "h10_", "s00_")){ # 生成5条观测的各列数据 city_col <- do.call(paste0, replicate(5, sample(LETTERS, 5, TRUE), FALSE)) race_col <- sample(1:2, 5, TRUE) id_col <- do.call(paste0, replicate(5, sample(0:9, 5, TRUE), FALSE)) # 构造带指定列名的DataFrame df <- data.frame( !!paste0(prefix, "city") := city_col, !!paste0(prefix, "race") := race_col, id = id_col, stringsAsFactors = FALSE ) # 将DataFrame赋值到全局环境并命名 assign(paste0(prefix, "2000"), df) }
!!和:=用于动态生成列名,直接得到h00_city这类符合要求的列名- 拆分数据生成与DataFrame构造步骤,逻辑更清晰
方案2:用setNames()设置列名(兼容旧版R)
for(prefix in c("h00_", "h10_", "s00_")){ # 生成5条观测的各列数据 city_col <- do.call(paste0, replicate(5, sample(LETTERS, 5, TRUE), FALSE)) race_col <- sample(1:2, 5, TRUE) id_col <- do.call(paste0, replicate(5, sample(0:9, 5, TRUE), FALSE)) # 先构造基础DataFrame,再修改列名 df <- data.frame(city_col, race_col, id_col, stringsAsFactors = FALSE) colnames(df) <- c(paste0(prefix, "city"), paste0(prefix, "race"), "id") # 赋值并命名DataFrame assign(paste0(prefix, "2000"), df) }
内容的提问来源于stack exchange,提问作者tchoup
相关产品推荐
相关产品推荐

