r - 基于使用 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))
解决方案
实际上,您的做法是错误的。让我解释-
- 在示例数据中它正在工作,因为较大的 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 )
推荐阅读
- sql - 如何在没有分组依据的情况下选择具有最大技能属性的 ID
- html - 使用倒置曲线创建形状
- javascript - 从键 1 开始的对象中的变换数组
- objective-c - 我正在尝试将 Java byte[] 转换为 Objective-c
- javascript - JS:从异步函数返回承诺而不解决承诺?
- r - R:从每月时间序列中提取单月数据
- ruby-on-rails - 如何在另一台机器上使用 Webpacker 和 React 设置 Rails 项目?
- unity3d - Unity Input.GetKeyDown 不适用于多个键
- apache-zookeeper - 来自 Spring Cloud 的 Zookeeper 对象实例
- javafx - 在 JavaFX 中制作照片幻灯片时出错