匹配r中不等长数据帧的数据

Ker*_*rry 4 r match

这看起来应该非常简单.在R中有2个不等长度的数据帧.1只是较大数据集的随机子集.因此,它们具有完全相同的精确数据和唯一ID.我想做的是在较大的数据集中放置一个指示0或1的指示符,表示该行位于较小的数据集中.

我可以使用,which(long$UniqID %in% short$UniqID)但我似乎无法弄清楚如何将此指标与长数据集匹配

Did*_*rts 7

制作相同的样本数据.

long<-data.frame(UniqID=sample(letters[1:20],20))
short<-data.frame(UniqID=sample(letters[1:20],10))
Run Code Online (Sandbox Code Playgroud)

您可以使用%in%without which()来获取值TRUE和FALSE,然后as.numeric()将它们转换为0和1.

long$sh<-as.numeric(long$UniqID %in% short$UniqID)
Run Code Online (Sandbox Code Playgroud)


Aru*_*run 7

我将使用@AnandaMahto的数据来说明另一种使用方式duplicated,如果您有uniqueID ,也可以使用.

案例1:具有唯一的id列

set.seed(1)
df1 <- data.frame(ID = 1:10, A = rnorm(10), B = rnorm(10))
df2 <- df1[sample(10, 4), ]
transform(df1, indicator = 1 * duplicated(rbind(df2, df1)[, "ID", 
            drop=FALSE])[-seq_len(nrow(df2))])
Run Code Online (Sandbox Code Playgroud)

案例2:没有唯一的id列

set.seed(1)
df1 <- data.frame(A = rnorm(10), B = rnorm(10))
df2 <- df1[sample(10, 4), ]
transform(df1, indicator = 1 * duplicated(rbind(df2, df1))[-seq_len(nrow(df2))])
Run Code Online (Sandbox Code Playgroud)

  • 非常好+1.@Kerry,当一个易于重现的例子被共享时会发生什么奇迹!:) (3认同)

A5C*_*2T1 6

到目前为止答案都很好.然而,提出了一个问题,"如果没有"UniqID"专栏怎么办?

那时,或许merge可以提供帮助:

以下是使用ID merge%in%ID可用的示例:

set.seed(1)
df1 <- data.frame(ID = 1:10, A = rnorm(10), B = rnorm(10))
df2 <- df1[sample(10, 4), ]

temp <- merge(df1, df2, by = "ID")$ID
df1$matches <- as.integer(df1$ID %in% temp)
Run Code Online (Sandbox Code Playgroud)

并且,ID不可用的类似示例.

set.seed(1)
df1_NoID <- data.frame(A = rnorm(10), B = rnorm(10))
df2_NoID <- df1_NoID[sample(10, 4), ]

temp <- merge(df1_NoID, df2_NoID, by = "row.names")$Row.names
df1_NoID$matches <- as.integer(rownames(df1_NoID) %in% temp)
Run Code Online (Sandbox Code Playgroud)