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

时间:2013-04-23 08:51:49

标签: r match

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

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

5 个答案:

答案 0 :(得分:7)

制作相同的样本数据。

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

您可以使用不%in%的{​​{1}}来获取值TRUE和FALSE,然后使用which()将它们转换为0和1。

as.numeric()

答案 1 :(得分:7)

我将使用@ AnandaMahto的数据来说明使用duplicated的另一种方法,如果您有unique ID,也可以使用。

案例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))])

案例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))])

答案 2 :(得分:6)

到目前为止的答案都很好。但是,提出了一个问题,“如果没有”UniqID“栏会怎么样?

此时,也许merge可以提供帮助:

以下是使用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)

并且,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)

答案 3 :(得分:4)

您可以直接将逻辑向量用作新列:

long$Indicator <- 1*(long$UniqID %in% short$UniqID)

答案 4 :(得分:0)

看看这是否可以让你入门:

long <- data.frame(UniqID=sample(1:100)) #creating a long data frame
short <- data.frame(UniqID=long[sample(1:100, 30), ]) #creating a short one with the same ids.

long$indicator <- long$UniqID %in% short$UniqID #creating an indicator column in long.
> head(long)
  UniqID indicator
1     87      TRUE
2     15      TRUE
3    100      TRUE
4     40     FALSE
5     89     FALSE
6     21     FALSE