【问题标题】:Matching values in a column of one data frame with subsets of a column in another data frame将一个数据帧的列中的值与另一个数据帧中的列子集匹配
【发布时间】:2013-04-20 22:47:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: r match subset


    【解决方案1】:

    这应该可行:

    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
    

    【讨论】:

    • 是的,效果很好。非常感谢!还要感谢 Andy 进行编辑以提高我原始帖子的清晰度。
    • @user2093526 - 没问题,很高兴为您提供帮助 - 如果这回答了问题,请在向上/向下投票箭头旁边打勾以表示这一点。
    • 可以改用tapplytapply(DF2$number, DF2$category, function(x) DF1$number %in% x+0)
    猜你喜欢
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多