R-通过唯一ID的数据帧中的列值比较列值



我敢肯定我可以直接解决这个问题的解决方案,但是我没有看到一个可比的问题,所以我想我会发布一个问题。

我有一个纵向数据集,其中有数千名受访者在几个时间间隔内。从问题到数据类型的所有事物之间的所有内容都可能有所不同,并且通常需要构建一系列的布尔来构建指标或虚拟变量,但是每个受访者都有一个唯一的ID,没有其他受访者在第一个波浪之后添加了调查,因此很容易,因此够了。

问题是,虽然早期波由一个(Stata(每个文件组成,但后者的浪潮包含许多附录文件,结构性不同。因此,例如,在为以前的伴侣的性别构建先前的指标时,有列(一个波(称为partnernum和sex,每个唯一的ID(受访者(最多有16行。足够容易地传播(或铸造(该数据,能够为每个唯一ID和列partnernum_1 ... partnernum_16创建一行,其中来自性爱列中的值作为panteraldf中的条目。然后易于构造指标:

sexuality$newIndicator[mainDF$bioSex = "Male" & apply(partnerDF[1:16] == "Male", 1, any)] <- 1

对于最后两个浪潮中的其他附录文件,数据像合作伙伴数据一样长,每个唯一的ID都有多行,但是我不仅要使用一个变量,而且我需要使用数百个来对抗构造指标,所有这些指标都用不同的类型编码,因此扩展(或铸造(宽的数据是不切实际的(不用介意编写这些布尔(。实际上,每个浪潮中有几个文件,它们的结构方式仅占据1行(唯一ID(,其中一些几十个。(我已经将每个波的附录文件放在一起。(

我想做的就是测试以下内容:

newDF$indicator[any(waveIIIAdds$var1 == 1) & any(waveIIIAdds$var2 == 1)] <- 1

newDF$indicator[mainDF$var1 == 1 & any(waveIIIAdds$var2 == 1)] <- 1

其中newDF与aindf的长度相同(每个唯一ID(。

所以,例如,如果我有两个DFS。

df1 <- data.frame(ID = c(1:4), A = rep("a"))
df2 <- data.frame(ID = rep(1:4, each=2), B = rep(1:2, 2), stringsAsFactors = FALSE)
df1$A[1] <- "b"
df1$A[3] <- "b"
df2$B[8] <- 3
> df1   > df2
ID A    ID B
1  b    1  1
2  a    1  2
3  b    2  1
4  a    2  2
        3  1
        3  2
        4  1
        4  3

我想像(假设DF3有一列,只是DF1的唯一ID(

df3$new <- 0
df3$new[df1$ID[df1$A == "a"] & df2$ID[df2$B == 2]] <- 1

使DF3每行具有一个唯一的ID,并且由于所有ID中的DF1 $ A中有一个" A",但DF1 $ A [1]和至少一排Df2 $ b的df1 $ a [1]除了最后一个ID(DF2 $ B [7:8](结果是:

> df3
ID new
1  0
2  1
3  1
4  0

df3$new <- 0
df3$new[df1$ID[df1$A == "a"] | df2$ID[df2$B == 2]] <- 1
> df3
ID new
1  1
2  1
3  1
4  0

这样做...

df3 <- data.frame(ID=unique(df1$ID),
                  new=sapply(unique(df1$ID),function(x) 
                     as.numeric(x %in% df1$ID[df1$A == "a"] & x %in% df2$ID[df2$B == 2])))
df3
  ID new
1  1   1
2  2   1
3  3   1
4  4   0

我想出了一个简约的解决方案,在返回问题后几分钟考虑了(而不是帖子的早晨的凌晨(。

我想要一些研究生,他们可能会以这种方式构建数千个指标或虚拟变量,并且可能会首先学习R,甚至只能学习R。以下提供了使用相同模式的示例和实际数据的解决方案:

如果已经使用IDS创建了DF,并且如示例所假设的那样,已启动的虚拟指示器的列值:

df3 <- data.frame(ID = df1$ID)
df3$new <- 0

我的解决方案是:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] & df1$ID %in% df2$ID[df2$B == 2]] <- 1 
> df3
ID new
1   0
2   1
3   0
4   1

使用|(或(:

df3$new[df1$ID %in% df1$ID[df1$A == "a"] | df1$ID %in% df2$ID[df2$B == 2]] <- 1 
> df3
ID new
1   1
2   1
3   0
4   1

相关内容

  • 没有找到相关文章

最新更新