r - r - 匹配两个数据帧并在条件下将行从一个插入另一个
问题描述
最近我一直在尝试使用 2 个数据帧产生一定的输出,但似乎我的 R 经验仍然不足以做到这一点。我花了很多时间,但无法找到如何做到这一点的答案。对以下任务的任何帮助表示赞赏。
我有两个数据集base_df
和compare_df
. compare_df
需要base_df
使用以下规则 插入特定元素(单元格) :
a) 来自id
列的元素和来自的base_df
元素应该相等 id
compare_df
_
b) 如果数字来自 xx、yy 或 zz,则在使用ex分隔符分隔字符之后。"1.5_2.5" 可以保存在 2 个单独的变量中,例如val1
= 1.5 和val2
= 2.5 ,因此:
如果然后在 1 和 2 行之间插入(compare_df$val1 > base_df$var1 & compare_df$val1 < lead(base_df$var1)) & (compare_df$val2 > base_df$var2 & compare_df$val2 < lead(base_df$var2))
值val1
和val2
.compare_df
base_df
c) 使用已完成交换的变量的名称,在本例中为 ex。假设创建新变量ind
,并为新创建的 row2 赋值给这个变量,base_df
等于“xx”。
注意:compare_df
有许多类似xx,yy and zz
的列也需要完成该过程。compare_df
因此,除了 id 之外的所有列都会检查条件。
基本上每行信息compare_df
都应该与中的所有行进行比较base_df
,看看是否满足条件。可能有多个匹配项。应保持行的原始顺序,因此arrange
不能使用,因为var1
并且var2
不会随着行数的增加而增加。也许它可以用apply
功能来完成?
以下是简化示例:
base_df <- data.frame(id = c("a", "a", "a", "a", "a", "b", "b", "b", "b", "b"),
var1 = c(1,3,5,-7,-9,11,13,15,17,19),
var2 = c(2,4,6,8,-10,12,14,16,18,20))
compare_df <- data.frame(id = c("a", "b"),
xx = c("1.5_2.5", "17.5_18.5"),
yy = c("3.5_2.5", "12.5_18.5"),
zz = c("3.5_4.5", "15.5_16.5"))
# desired
final_df <- data.frame(
id = c("a", "a", "a", "a", "a", "a", "a", "b", "b", "b", "b", "b", "b", "b"),
ind = c("org", "xx", "org", "zz", "org", "org", "org", "org", "org", "org", "zz", "org", "xx", "org"),
var1 = c(1, 1.5, 3, 3.5, 5, -7, -9, 11, 13, 15, 15.5, 17, 17.5, 19),
var2 = c(2, 2.5, 4, 4.5, 6, 8, -10, 12, 14, 16, 16.5, 18, 18.5, 20))
解决方案
使用tidyverse的解决方案。假设在新数据框中的列中base_df
调用原始行。目前尚不完全清楚您的过滤条件是什么,但我试图匹配您的预期输出。是最终的输出。old
ind
new_df
library(tidyverse)
compare_df2 <- compare_df %>%
gather(ind, value, -id) %>%
separate(value, into = c("var1", "var2"), sep = "_", convert = TRUE)
new_df <- base_df %>%
mutate(ind = "org") %>%
bind_rows(compare_df2) %>%
select(id, ind, var1, var2) %>%
arrange(id, var1, var2) %>%
filter(var2 > var1) %>%
filter(row_number() != which(var2 < lag(var2)) - 1)
new_df
# id ind var1 var2
# 1 a org 1.0 2.0
# 2 a xx 1.5 2.5
# 3 a org 3.0 4.0
# 4 a zz 3.5 4.5
# 5 a org 5.0 6.0
# 6 a org 7.0 8.0
# 7 a org 9.0 10.0
# 8 b org 11.0 12.0
# 9 b org 13.0 14.0
# 10 b org 15.0 16.0
# 11 b zz 15.5 16.5
# 12 b org 17.0 18.0
# 13 b xx 17.5 18.5
# 14 b org 19.0 20.0
推荐阅读
- typescript - 如何在 React-Native 中使用 Firebase 对用户进行离线身份验证?
- python - 将 HTML 实体写入文件
- discord.js - 如何删除 discord.js 中的 webhook?
- excel - 为表单提交中的每条记录创建唯一 ID
- python - 减法中的角落测试用例场景
- python - 如何在python中打印每行的最大总和?
- php - 将结果拆分为两列并保留字母顺序
- java - 编译错误..无法将类解析为类型
- cordova - Ionic v1 - 播放计费非消耗品购买批准事件在重新启动时自动调用应用程序
- docker - Vue 中的热重载在 Docker 容器中不起作用