我是R的新手。我有一个数据框(usr.query),其结构如下所示
[
现在我想获取每个id的文本并将其与所有其他id的文本进行比较,如果匹配,我想将其附加到新列中,称为匹配计数。
A0008 with A0043,A0065,A0082,B0018,B0026
A0043 with A0008,A0065,A0082,B0018,B0026
要应用的功能
count_match = length(intersect(unlist(strsplit(query1," ")),unlist(strsplit(query2," "))))
此处的查询1是A0008的文本,查询2是A0043,A0065,A0082,B0018,B0026的文本
答案 0 :(得分:2)
不需要循环;你通常会发现R中的情况,因为它非常擅长利用矢量化操作。在这种情况下,您可以使用combn
获得必要的组合,然后通过使用新的组合对原始data.frame进行子集化并测试相等性来创建match_count
列。添加零会将值从布尔值更改为数值(如果您愿意,请使用as.integer
。)
# assemble sample data
df <- data.frame(id = 1:5, text = c('apple', 'mango', 'apple', 'apple', 'mango'))
# make combinations
df2 <- as.data.frame(t(combn(df$id, 2)))
# add names
names(df2) <- c('main_id', 'compared_to_id')
# test for match
df2$match_count <- (df[df2$main_id, 'text'] == df[df2$compared_to_id, 'text']) + 0
结果:
> df2
main_id compared_to_id match_count
1 1 2 0
2 1 3 1
3 1 4 1
4 1 5 0
5 2 3 0
6 2 4 0
7 2 5 1
8 3 4 1
9 3 5 0
10 4 5 0