3

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

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

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

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与. 理想情况下,如果匹配成功,这些新列中的行将显示“1”,如果没有匹配,则显示“0”。使用下面的虚拟数据,我最终会得到 4 列(、、和),每列 10 行。DF2$numberDF2$categoryDF1DF1$numberDF1$ADF1$BDF$C

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

4

1 回答 1

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
于 2013-04-20T23:00:02.120 回答