如何在R语言中构建每个ID对应固定IQ及全字母分值的数据集?
如何在R语言中构建多受试者-多字母匹配的数据集
需求:构建包含300个受试者的数据集,每个受试者(以id标识)有唯一的正态分布IQ分数,且每个受试者对应全部20个字母(a-t),每个字母对应固定的value分值。
现有错误代码及问题
当前编写的代码如下:
id <- 1:300 iq <- rnorm(n=300, mean=120, sd=15) letter <- rep(c("a","b","c","d","e","f","g","h","i","j", "k","l","m","n","o","p","q","r","s","t"),15) value <- rep(c(2,2,1,2,2,2,2,2,3,2, 3,1,3,2,1,2,2,2,1,2),15) df <- data.frame(id,iq,letter,value) df$id <- as.character(id)
运行head(df)得到的结果不符合需求,每个受试者仅对应一个字母:
id iq letter value 1 1 126.35025 a 2 2 2 150.08165 b 2 3 3 105.88712 c 1 4 4 106.86652 d 2 5 5 97.86159 e 2 6 6 116.39497 f 2
期望的数据集格式
期望每个受试者对应全部目标字母,示例(单个受试者对应4个字母):
id2 <- rep(1,4) iq2 <- 120 letter2 <- c("a","b","c","d") value2 <- c(2,2,1,2) df2 <- data.frame(id2, iq2, letter2, value2)
输出结果:
id2 iq2 letter2 value2 1 1 120 a 2 2 1 120 b 2 3 1 120 c 1 4 1 120 d 2
解决方法
方法1:使用expand.grid生成笛卡尔积
先分别构建受试者信息表和字母-分值表,再通过笛卡尔积组合所有可能的配对:
# 构建受试者信息:每个id对应唯一iq subjects <- data.frame( id = as.character(1:300), iq = rnorm(n=300, mean=120, sd=15) ) # 构建字母-分值对应表:每个letter对应固定value letters_values <- data.frame( letter = c("a","b","c","d","e","f","g","h","i","j", "k","l","m","n","o","p","q","r","s","t"), value = c(2,2,1,2,2,2,2,2,3,2, 3,1,3,2,1,2,2,2,1,2) ) # 生成所有受试者与字母的组合,自动匹配对应的iq和value df <- expand.grid(id = subjects$id, letter = letters_values$letter) df <- merge(df, subjects, by = "id") df <- merge(df, letters_values, by = "letter") # 可选:按id排序,让同一受试者的记录连在一起 df <- df[order(df$id), ] rownames(df) <- NULL # 重置行号
方法2:手动重复向量(基础R写法)
通过重复受试者信息20次,重复字母-分值信息300次来构建数据集:
id <- rep(1:300, each = 20) # 每个id重复20次(对应20个字母) iq <- rep(rnorm(n=300, mean=120, sd=15), each = 20) # 每个iq重复20次 letter <- rep(c("a","b","c","d","e","f","g","h","i","j", "k","l","m","n","o","p","q","r","s","t"), 300) # 字母序列重复300次 value <- rep(c(2,2,1,2,2,2,2,2,3,2, 3,1,3,2,1,2,2,2,1,2), 300) # 分值序列重复300次 df <- data.frame(id = as.character(id), iq, letter, value)
两种方法都能得到符合需求的数据集,每个受试者对应全部20个字母,且iq和letter的value保持恒定。
内容的提问来源于stack exchange,提问作者Shawn Hemelstrand
相关产品推荐
相关产品推荐

