R-使用循环创建条件变量

R-使用循环创建条件变量,r,if-statement,for-loop,R,If Statement,For Loop,我有一个这样的数据集(但这只是一个子集;真实的数据集有数百个ID_Desc变量),其中每个数据点都有一个人的性别,以及他们是否勾选了一些描述符(1)或(NA): 我正在尝试编写一个循环,它将(1)检查他们的性别,(2)根据他们的性别,检查他们是否在第一个列表中检查了相同的描述符(列出ID1和ID2表示性别=1,列出ID1和ID3表示性别=2),以及(3)创建一个新变量(相同#)指示它们是否在两个列表中签出了相同的描述符(通过写入1)或未签出(通过写入0) 我一直在使用这段代码,它似乎在检查他们的

我有一个这样的数据集(但这只是一个子集;真实的数据集有数百个ID_Desc变量),其中每个数据点都有一个人的性别,以及他们是否勾选了一些描述符(1)或(NA):

我正在尝试编写一个循环,它将(1)检查他们的性别,(2)根据他们的性别,检查他们是否在第一个列表中检查了相同的描述符(列出ID1和ID2表示性别=1,列出ID1和ID3表示性别=2),以及(3)创建一个新变量(相同#)指示它们是否在两个列表中签出了相同的描述符(通过写入1)或未签出(通过写入0)

我一直在使用这段代码,它似乎在检查他们的性别,并创建新的变量(相同),但它为所有内容都写0,这是不正确的:

for (i in 1:3){
  assign(paste("Same",i,sep=""),
  ifelse(Gender=="1",
         ifelse(paste("ID1_Desc_",i,sep="")==paste("ID2_Desc_",i,sep=""),1,0),
         ifelse(paste("ID1_Desc_",i,sep="")==paste("ID3_Desc_",i,sep=""),1,0)
         )
  )
}
根据我提供的数据,Same1应该是0 0 1(因为性别=1,他们在ID1和ID2列表中选择了Desc_3),Same2应该是0 1 0(因为性别=2,他们在ID1和ID3列表中选择了Desc_2),Same3应该是0 1 0(因为性别=1,他们在ID1和ID2列表中选择了Desc_2),但现在,所有3个结果都是0

我知道使用循环可能不是最好的方法,但如果可能的话,我很想知道如何使用循环。如果没有,任何有效的方法都会得到极大的赞赏。谢谢。

你可以试试这个

 ind1 <- grep("^ID1", colnames(df))
 ind2 <- grep("^ID2", colnames(df))
 ind3 <- grep("^ID3", colnames(df))
 cond1 <- do.call(cbind,Map(`==` , df[ind1], df[ind2]))
 cond2 <- do.call(cbind,Map(`==` , df[ind1], df[ind3]))
 Finalind <- do.call(cbind, Map(`|`, as.data.frame(t(cond1)),
                    as.data.frame(t(cond2))))
 res <- (!is.na(Finalind))+0
 rownames(res) <- paste0("Same", 1:3)
 t(res)
 #    Same1 Same2 Same3
 #V1     0     0     1
 #V2     0     1     0
 #V3     0     1     0


 cbind(df, t(res))

ind1您能重新表述一下您想做的事情吗?我看不出你想得到什么;我想得到39个新的数据帧,命名为Same1到Same39,其中每个帧都包含一系列的0和1,指示对于每个数据点,列ID1_Desc_35;==ID2_Desc_35;(如果性别=1)还是ID1_Desc_35;==ID3_Desc_35;(如果性别=2)。这有意义吗?谢谢!那几乎是完美的。唯一的问题是res是反向的——数据点是水平运行的(在列中),而“相同”变量是真实运行的(在行中)。如果我将
colnames(res)
更改为
rownames(res)
,并使用
t(res)
跟随该行,那就完美了。再次感谢@abclist19我对此也有怀疑。
 ind1 <- grep("^ID1", colnames(df))
 ind2 <- grep("^ID2", colnames(df))
 ind3 <- grep("^ID3", colnames(df))
 cond1 <- do.call(cbind,Map(`==` , df[ind1], df[ind2]))
 cond2 <- do.call(cbind,Map(`==` , df[ind1], df[ind3]))
 Finalind <- do.call(cbind, Map(`|`, as.data.frame(t(cond1)),
                    as.data.frame(t(cond2))))
 res <- (!is.na(Finalind))+0
 rownames(res) <- paste0("Same", 1:3)
 t(res)
 #    Same1 Same2 Same3
 #V1     0     0     1
 #V2     0     1     0
 #V3     0     1     0


 cbind(df, t(res))
df <- structure(list(Gender = c(1L, 2L, 1L), ID1_Desc_1 = c(NA, NA, 
1L), ID1_Desc_2 = c(NA, 1L, 1L), ID1_Desc_3 = c(1L, 1L, 1L), 
ID2_Desc_1 = c(NA, NA, NA), ID2_Desc_2 = c(NA, NA, 1L), ID2_Desc_3 = c(1L, 
NA, NA), ID3_Desc_1 = c(NA, 1L, NA), ID3_Desc_2 = c(NA, 1L, 
NA), ID3_Desc_3 = c(NA, NA, NA)), .Names = c("Gender", "ID1_Desc_1", 
"ID1_Desc_2", "ID1_Desc_3", "ID2_Desc_1", "ID2_Desc_2", "ID2_Desc_3", 
"ID3_Desc_1", "ID3_Desc_2", "ID3_Desc_3"), class = "data.frame",
 row.names = c(NA, -3L))