R-数据帧中两个子集的新变量,行中的随机顺序

R-数据帧中两个子集的新变量,行中的随机顺序,r,apply,R,Apply,我有一个包含两组变量的数据框:首先,30列包含30个刺激ID,但每行的顺序是随机的。然后,计算与每个刺激相关的30个响应值。每个块的第一列由一个刺激-反应对组成,每个块的第二列是第二个刺激-反应对等,但刺激id本身是不同的 我想为每个刺激ID和相应的响应创建新变量。 我相信我得到的与这个问题的最终结果相似: 例如: set.seed(3) d <- data.frame( a = c("L", "G", "E", "E"), b = c("G", "E"

我有一个包含两组变量的数据框:首先,30列包含30个刺激ID,但每行的顺序是随机的。然后,计算与每个刺激相关的30个响应值。每个块的第一列由一个刺激-反应对组成,每个块的第二列是第二个刺激-反应对等,但刺激id本身是不同的

我想为每个刺激ID和相应的响应创建新变量。 我相信我得到的与这个问题的最终结果相似:

例如:

set.seed(3)
d <- data.frame( a = c("L", "G", "E", "E"), 
                 b = c("G", "E", "L", "G"), 
                 c = c("E", "L", "G", "L"), 
                 e = rnorm(4), f = rnorm(4), g = rnorm(4))
d
#   a b c          e          f          g
# 1 L G E -1.1312186 -0.3076564  0.1998116
# 2 G E L -0.7163585 -0.9530173 -0.5784837
# 3 E L G  0.2526524 -0.6482428 -0.9423007
# 4 E G L  0.1520457  1.2243136 -0.2037282
set.seed(3)

d一个选项是创建行/列索引,从列4:6中提取值,并将其分配给数据集中的三个新列

un1 <- unique(unlist(d[1:3]))
d[un1] <- lapply(un1, function(x) 
         d[4:6][cbind(seq_len(nrow(d)), max.col(d[1:3] == x, "first"))])
un1
d$L <- ifelse(d$a == "L", d$e,
              ifelse(d$b=="L", d$f,
                     ifelse(d$c=="L", d$g, NA)))
un1 <- unique(unlist(d[1:3]))
d[un1] <- lapply(un1, function(x) 
         d[4:6][cbind(seq_len(nrow(d)), max.col(d[1:3] == x, "first"))])
d <- structure(list(a = c("L", "G", "E", "E"), b = c("G", "E", "L", 
"G"), c = c("E", "L", "G", "L"), e = c(-1.1312186, -0.7163585, 
0.2526524, 0.1520457), f = c(-0.3076564, -0.9530173, -0.6482428, 
1.2243136), g = c(0.1998116, -0.5784837, -0.9423007, -0.2037282
)), class = "data.frame", row.names = c("1", "2", "3", "4"))