我很难为复杂的变量赋值需求找到解决方案。我需要根据现有变量中的值创建新变量,但每次都需要使用不同的现有变量集多次创建相同的新变量。例如,我有以下数据帧:
dat=data.frame(
kiwi_3=c(1,0,1),
kiwi_5=c(0,0,1),
kiwi_8=c(1,1,0),
apple_3=c(0,0,0),
apple_5=c(1,0,1),
apple_8=c(1,1,0))
我可以使用以下代码行根据现有变量中的值创建一个新变量:
dat<-dat %>%
mutate(fruit_3=case_when(kiwi_3==1 & apple_3==1~1,
kiwi_3==1 & apple_3==0~2))
然而,我需要做的是使用相同的逻辑,基于具有相同(非顺序(数字后缀的变量,为每个数字后缀(在本例中,为fruit_3、fruit_5、fruit_8(创建变量。实际的逻辑也比这个例子中更复杂,所以我想使用case_when是必要的。我想有一个使用dplyr突变和交叉的解决方案,可能有带变量名的索引向量,但我还没有找到一个有效的解决方案。
谢谢你的建议!
使用列编号和偏移量可能更容易。这里是一个使用for
循环的半生不熟的例子,其中成对的值被简单地相乘在一起以生成二进制结果,(假设如果kiwi=0或apple=0,则结果=0:
dat=data.frame(
kiwi_3=c(1,0,1),
kiwi_5=c(0,0,1),
kiwi_8=c(1,1,0),
apple_3=c(0,0,0),
apple_5=c(1,0,1),
apple_8=c(1,1,0))
mat <- matrix(NA, nrow = 3, ncol = 3)
for (i in 1:3) {
for (j in 1:3) {
mat[i, j] <- dat[i, j] * dat[i, j+3]
}
}
cbind(dat, mat)
kiwi_3 kiwi_5 kiwi_8 apple_3 apple_5 apple_8 1 2 3
1 1 0 1 0 1 1 0 0 1
2 0 0 1 0 0 1 0 0 1
3 1 1 0 0 1 0 0 1 0
列名也必须添加到输出矩阵中。这将单独起作用,但其他人可能对如何使用dplyr
重构方法有想法。