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

时间:2014-11-26 02:36:42

标签: r if-statement for-loop

我有一个像这样的数据集(但这只是一个子集;真正的数据集有数百个ID_Desc变量),其中每个数据点都有一个人的性别,以及他们是否检查过多个描述符(1) (NA):

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
1       NA          NA          1           NA          NA          1           NA          NA           NA
2       NA          1           1           NA          NA          NA          1           1            NA
1       1           1           1           NA          1           NA          NA          NA           NA

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

我一直在使用这段代码,这似乎是检查他们的性别确定并创建新变量(Same#),但是它为所有内容写了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(因为Gender = 1并且他们在ID1和ID2列表中都选择了Desc_3),Same2应该是0 1 0(因为Gender = 2并且他们选择了Desc_2 in ID1和ID3列表)和Same3应该是0 1 0(因为Gender = 1并且他们在ID1和ID2列表中都选择了Desc_2)但是现在,所有3都是0 0 0。

我知道使用循环可能不是最好的方法,但我真的很想知道如果可能的话如何使用循环。如果没有,任何有效的东西都会令人难以置信。感谢。

1 个答案:

答案 0 :(得分: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))

数据

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))