将一列的值与多个其他列的值进行比较

时间:2015-09-17 11:18:37

标签: r

我有一个唯一ID列(VariableA),我想与多个列进行比较(VariableB,VariableC ...)。

每列都有唯一的ID,但ID可能包含两列或更多列,如下所示:

VariableA VariableB VariableC 0001 0001 0008 0002 0003 0001 0004 0004 0002 0005 0006 0007 NA

我正在使用ainb <- variablea[,1] %in% variableb[,1]检查VariableA中是否存在VariableA中的值,但是我无法搜索如何获取存在于多个列中的VariableA中的值计数(VariableB) ,VariableC等)。

使用ainall <- variablea[,1] %in% dat[,2:6]只是给了我所有的错误。我认为问题可能是列的长度都不同。我不是试图按行匹配,只是每个单独的值。

希望足够清楚!任何帮助赞赏。

1 个答案:

答案 0 :(得分:2)

这是一个简单的例子。首先,让我们创建一个示例数据框:

data_example <- data.frame(var_a = 1:10, var_b = c(1:5,11:15), var_c=c(1:7, NA, NA, NA))
> data_example
   var_a var_b var_c
1      1     1     1
2      2     2     2
3      3     3     3
4      4     4     4
5      5     5     5
6      6    11     6
7      7    12     7
8      8    13    NA
9      9    14    NA
10    10    15    NA

因此,您可以看到var_avar_b重叠50%,var_c与70%重叠(var_c有一些NAs。

让我们看看每列的哪些唯一值重叠:

overlap_vals = apply(data_example, 2, intersect, data_example$var_a)
> overlap_vals
$var_a
 [1]  1  2  3  4  5  6  7  8  9 10

$var_b
[1] 1 2 3 4 5

$var_c
[1] 1 2 3 4 5 6 7

现在我们想知道var_a中有多少元素出现在这些重叠向量中。首先创建一个小辅助函数,获取列表中一个向量的比例重叠:

propn_overlap <- function(comparison_vector, id_vector){ 
                     sum(id_vector %in% comparison_vector) / length(id_vector)
                 }

现在我们可以使用sapply在列表中的所有向量上应用我们的辅助函数:

> sapply(overlap_vals, propn_overlap, data_example$var_a)
var_a var_b var_c 
  1.0   0.5   0.7