这看起来应该很简单。R 中有 2 个长度不等的数据帧。一个只是较大数据集的随机子集。因此,它们具有完全相同的数据和完全相同的 UniqueID。我想做的是在较大的数据集中放置一个指标,例如 0 或 1,表示该行位于较小的数据集中。
我可以使用which(long$UniqID %in% short$UniqID)
,但我似乎无法弄清楚如何将此指标匹配回长数据集
制作了相同的样本数据。
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)
我将使用@AnandaMahto 的数据来说明另一种使用方式duplicated
,如果您有unique
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))])
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))])
到目前为止的答案都很好。但是,有人提出了一个问题,“如果没有“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)
您可以直接将逻辑向量用作新列:
long$Indicator <- 1*(long$UniqID %in% short$UniqID)
看看这是否能让你开始:
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