首页 > 解决方案 > r - 匹配两个数据帧并在条件下将行从一个插入另一个

问题描述

最近我一直在尝试使用 2 个数据帧产生一定的输出,但似乎我的 R 经验仍然不足以做到这一点。我花了很多时间,但无法找到如何做到这一点的答案。对以下任务的任何帮助表示赞赏。

我有两个数据集base_dfcompare_df. compare_df需要base_df使用以下规则 插入特定元素(单元格) :

a) 来自id列的元素和来自的base_df元素应该相等 idcompare_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))val1val2.compare_dfbase_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))

下面的简化示例结果

标签: rdataframeinsertrows

解决方案


使用的解决方案。假设在新数据框中的列中base_df调用原始行。目前尚不完全清楚您的过滤条件是什么,但我试图匹配您的预期输出。是最终的输出。oldindnew_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

推荐阅读