将一个数据帧的列中的值与另一个数据帧中的列的子集进行匹配

时间:2013-04-20 22:47:50

标签: r match subset

我试图将一个数据帧的列中的值与第二个数据帧的列中的值进行匹配。棘手的部分是我想使用第二个数据帧的子集进行匹配(由第二个数据帧中与正在匹配的数据帧中的不同列指定)。这与基于数据帧之间的匹配尝试子集的常见问题不同。

我的问题恰恰相反 - 我想根据子集匹配数据帧。具体来说,我想将第二个数据帧中列的子集与第一个数据帧的整个列匹配,然后在第一个数据帧中创建新列,显示是否已为每个数据帧进行匹配子集。

这些子集可以有不同的行数。使用下面的两个虚拟数据帧......

DF1 <- data.frame(number=1:10)

DF2 <- data.frame(category = rep(c("A","B","C"), c(5,7,3)), 
                  number = sample(10, size=15, replace=T))

...目标是创建三个新列(DF1$ADF1$BDF$C),以显示DF1$number中的值是否与值匹配DF2$numberDF2$category的每个子集的DF1。理想情况下,这些新列中的行会显示“&#39; 1&#39;如果匹配并且“0”和“如果匹配没有。对于下面的虚拟数据,我最终得到的DF1$number有4列(DF1$ADF1$BDF$C和{{1}}),每列10行。

请注意,在我的实际第二个数据框中,我有大量的类别,因此我不想单独输入它们以完成此目标所需的任何操作。我希望这是有道理的!对不起,如果我遗漏了一些明显的东西,非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:2)

这应该有效:

sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0)

      A B C
 [1,] 0 0 1
 [2,] 1 1 0
 [3,] 1 1 1
 [4,] 0 1 0
 [5,] 0 0 1
 [6,] 0 1 0
 [7,] 1 1 0
 [8,] 1 0 0
 [9,] 1 0 0
[10,] 0 1 0

您可以将其添加回DF1,如:

data.frame(
   DF1,
   sapply(split(DF2$number, DF2$category), function(x) DF1$number %in% x + 0)
          )

   number A B C
1       1 0 0 1
2       2 1 1 0
3       3 1 1 1
4       4 0 1 0
5       5 0 0 1
6       6 0 1 0
7       7 1 1 0
8       8 1 0 0
9       9 1 0 0
10     10 0 1 0