循环通过数据框对R

时间:2016-01-29 02:38:27

标签: r

我是R的新手。我有一个数据框(usr.query),其结构如下所示

[This is my data frame[1]

现在我想获取每个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的文本

我尝试了建议的解决方案,结果如下。 enter image description here

1 个答案:

答案 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