这看起来应该非常简单。在R中有2个不等长度的数据帧.1只是较大数据集的随机子集。因此,它们具有完全相同的精确数据和唯一ID。我想做的是在较大的数据集中设置一个指示0或1的指示符,表示该行位于较小的数据集中。
我可以使用which(long$UniqID %in% short$UniqID)
,但我似乎无法弄清楚如何将此指标与长数据集匹配
答案 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,也可以使用。
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))])
答案 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