【问题标题】:Creating a column based on filtering two data frames of different lengths using R基于使用 R 过滤两个不同长度的数据帧创建列
【发布时间】:2021-09-02 04:28:06
【问题描述】:

我得到了两个不同长度的数据集。我想在数据集中创建一个新列,该列基于从较短的 df 中过滤特定列来获得更多行。我收到警告“较长的对象长度不是较短对象长度的倍数”。结果也不正确。我尝试创建一个较小的示例数据集,并尝试了相同的代码及其正确的结果。我不确定为什么我的原始数据结果不正确,我收到了警告。 示例数据集是

    structure(list(id = 1:10, activity = c(0, 0, 0, 0, 1, 0, 0, 1, 
0, 0), code = c(2, 5, 11, 15, 3, 18, 21, 3, 27, 55)), class = "data.frame", row.names = c(NA, 
-10L))

第二个df

    structure(list(id2 = 1:20, code2 = c(2, 5, 11, 15, 9, 18, 21, 
3, 27, 55, 2, 5, 11, 15, 3, 18, 21, 3, 27, 55), d_Activity = c(0, 
0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0)), class = "data.frame", row.names = c(NA, 
-20L))

我在收到警告的原始数据集和没有警告但结果正确的虚拟 dfs 上都尝试了此方法。

    data2 <- data2 %>% 
  mutate(d_Activity = ifelse(code2 %in% data1$code & activity == 1, 1,0))

【问题讨论】:

    标签: r tidyverse


    【解决方案1】:

    实际上,你做错了。让我解释一下-

    • 在示例数据中它可以正常工作,因为较大的 df 有行 (20),这是较小 df (10) 中行的倍数。
    • 因此,在您的语法中,您正在做的是检查一个完整向量与另一个完整向量(另一个 df 的列),因为 R 通常以向量化的操作方式工作。
    • 匹配one to many 的正确方法是通过purrr::map,其中第一个参数(此处为code2)中的每个单独值与另一个向量(即df1$code)一起操作,该向量不在map 的参数中。
    df1 <- structure(list(id = 1:10, activity = c(0, 0, 0, 0, 1, 0, 0, 1, 
                                           0, 0), code = c(2, 5, 11, 15, 3, 18, 21, 3, 27, 55)), class = "data.frame", row.names = c(NA, 
                                                                                                                                     -10L))
    df2 <- structure(list(id2 = 1:20, code2 = c(2, 5, 11, 15, 9, 18, 21, 
                                         3, 27, 55, 2, 5, 11, 15, 3, 18, 21, 3, 27, 55), d_Activity = c(0, 
                                                                                                        0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                                                       -20L))
    library(tidyverse)
    
    df2 %>%
      mutate(d_Activity = map(code2, ~ +(.x %in% df1$code[df1$activity == 1])))
    #>    id2 code2 d_Activity
    #> 1    1     2          0
    #> 2    2     5          0
    #> 3    3    11          0
    #> 4    4    15          0
    #> 5    5     9          0
    #> 6    6    18          0
    #> 7    7    21          0
    #> 8    8     3          1
    #> 9    9    27          0
    #> 10  10    55          0
    #> 11  11     2          0
    #> 12  12     5          0
    #> 13  13    11          0
    #> 14  14    15          0
    #> 15  15     3          1
    #> 16  16    18          0
    #> 17  17    21          0
    #> 18  18     3          1
    #> 19  19    27          0
    #> 20  20    55          0
    

    reprex package (v2.0.0) 于 2021-06-17 创建

    【讨论】:

    • 不完全。我想要来自 df2 的 code2,它存在于 df1$code 中,并且 df1 ==1 中的活动列也存在。
    • 如果您查看我使用 mutate 和 ifelse 包含在问题中的代码行,它可以正常工作,但不是我无法共享的原始数据集。
    • 我认为它适用于我的原始数据集,结果似乎不错。我将不胜感激对代码语法的一些解释。干杯
    • @kamrankhan,我试图解释这些事情。随时询问是否需要澄清。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2020-10-10
    • 2018-06-07
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多