我有一个像这样的数据集(但这只是一个子集;真正的数据集有数百个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。
我知道使用循环可能不是最好的方法,但我真的很想知道如果可能的话如何使用循环。如果没有,任何有效的东西都会令人难以置信。感谢。
答案 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))