4

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

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

4

5 回答 5

7

制作了相同的样本数据。

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

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

long$sh<-as.numeric(long$UniqID %in% short$UniqID)
于 2013-04-23T08:56:40.543 回答
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))])

案例 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))])
于 2013-04-23T09:34:26.620 回答
6

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

在这一点上,也许merge可以提供帮助:

下面是一个使用IDmerge%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)
于 2013-04-23T09:14:16.977 回答
4

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

long$Indicator <- 1*(long$UniqID %in% short$UniqID)
于 2013-04-23T08:56:33.233 回答
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
于 2013-04-23T09:03:40.003 回答