首页 文章

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

提问于
浏览
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 中的值是否与 DF2$number 中每个相应子集的 DF2$number 中的值匹配 . 理想情况下,如果匹配,这些新列中的行将显示'1',如果匹配则不显示'0' . 对于下面的虚拟数据,我最终会得到 DF1 ,每列有10列( DF1$numberDF1$ADF1$BDF$C ) .

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

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
    

相关问题