问题描述
我有一个包含来自 Twitter 的 5000 个 user_id 的数据集 1。我想将此数据集中的 user_ids 与另一个包含来自 Twitter 的其他 user_ids 的数据集 2 相交,同时在我的数据集 1 中创建一个新列,其中数据集 1 中的每个 user_id 要么获得分数“1”(如果相交)或“0” (如果没有相交)。我尝试了下面的代码,但我只是在新列“相交”中得到一个输出,其中包含一些(随机)零,然后是很多 NA。
for(i in 1:ncol(data1)){
#intersect with other data
ids_intersect = intersect(data1$user_id,data2$user_id)
if(length(ids_intersect == 0)){
data1[i,"intersect"] <- 0 # no intersect
} else {
data1[i,"intersect"] <- 1 # intersect
}
}
我还尝试了另一种代码,我发现它更直观,但由于两个数据集的行长度不同(“替换有 3172 行,数据有 5181”),因此该代码不起作用。但与上述相同,这里的意图是在新列“相交”中获得 1 分“如果相交”或 0/NA“如果没有相交”。但是我不确定如何在以下代码中实现它:
data$intersect <- intersect(data1$user_id,data2$user_id)
有没有办法根据是否有相交/匹配为新列中的 user_ids 分配 1 或 0?
解决方法
一个舒适的选择是将 mutate()
包中的 dplyr
与 Base R %in%
命令一起使用,如下所示。
数据
data1 <- data.frame(user_id = c("Test1","Test2","Test4","Test5"))
data2 <- data.frame(user_id = c("Test1","Test3","Test4"))
代码
data1 %<>%
mutate(Existence = ifelse(user_id %in% data2$user_id,1,0))
输出
> data1
user_id Existence
1 Test1 1
2 Test2 0
3 Test4 1
4 Test5 0