【问题标题】:How to subset from dataframe2 depending on the values in dataframe1 and stack all subsets in one dataframe in R?如何根据dataframe1中的值从dataframe2中提取子集并将所有子集堆叠在R中的一个数据框中?
【发布时间】:2019-09-04 02:21:46
【问题描述】:

我想创建一个函数,它采用数据帧 df1 的行(列 x1、x2、x3),该函数的输出是数据帧 df2 的子集(列 y1、y2),这个子集是根据 df1 行中的值计算。我想将此函数应用于 df1 的每一行并将生成的数据帧(df2 的子集)堆叠在一个大数据帧中。示例如何使用 for 循环完成: df1 示例:

x1   x2   x3
a    3.1  4.5
b    9.0  10.1
a    9.0  20.0
c    1.1  6.0

df2 示例:

y1  y2
a   4.0
a   10.0
a   3.5
b   9.8
b   9.5
b   25.0
c   8.2
c   12.0

执行此处理的 for 循环示例:

desired_df = df2[1, ]
for (i in 1:nrow(df1)) {
  subset = filter(df2, y1 == df1[i, "x1"] & y2 > df1[i, "x2"] & y2 < df1[i, "x3"])
  desired_df = rbind(desired_df, subset)
}
desired_df = desired_df[-1, ]

所需的数据框是:

  y1   y2
  a  4.0
  a  3.5
  b  9.8
  b  9.5
  a 10.0

根据 df1 中的值,子集可以给出不同长度的数据帧(有时没有元素) 问题是:如何在没有for循环的情况下以向量化的形式编写这个子集和附加的过程?

【问题讨论】:

  • 请展示一个可重现的小例子和预期的输出
  • 如果您的所有函数都过滤行,那么应用此 "for each row of df1" 确实效率低下。最好以矢量化方式进行过滤。正如 akrun 建议的那样,如果您可以稍微改进一下这个问题(例如,dput(head(x)) 的输出和该样本的预期输出),那真的很有帮助。建议阅读:stackoverflow.com/questions/5963269stackoverflow.com/help/mcvestackoverflow.com/tags/r/info
  • @akrun 编辑了问题并添加了可重复的示例

标签: r dataframe apply


【解决方案1】:

看来我们需要fuzzy_join

library(dplyr)
library(fuzzyjoin)
fuzzy_inner_join(df1, df2, by = c('x1' = 'y1', 'x2' = 'y2', 'x3' = 'y2'),
          match_fun = list(`==`, `<=`, `>`)) %>%
    select(names(df2))
#  y1   y2
#1  a  4.0
#2  a  3.5
#3  b  9.8
#4  b  9.5
#5  a 10.0

数据

df1 <- structure(list(x1 = c("a", "b", "a", "c"), x2 = c(3.1, 9, 9, 
1.1), x3 = c(4.5, 10.1, 20, 6)), class = "data.frame", row.names = c(NA, 
-4L))

df2 <- structure(list(y1 = c("a", "a", "a", "b", "b", "b", "c", "c"), 
    y2 = c(4, 10, 3.5, 9.8, 9.5, 25, 8.2, 12)), class = "data.frame", 
    row.names = c(NA, 
-8L))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2017-12-15
    • 2013-01-10
    • 2023-03-17
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多