首页 > 解决方案 > 基于使用 R 过滤两个不同长度的数据帧创建列

问题描述

我得到了两个不同长度的数据集。我想在数据集中创建一个新列,该列基于从较短的 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))

标签: rtidyverse

解决方案


实际上,您的做法是错误的。让我解释-

  • 在示例数据中它正在工作,因为较大的 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 包于 2021-06-17 创建 (v2.0.0 )


推荐阅读