如何根据dataframe1中的值从dataframe2生成子集,并将所有子集堆叠在R中的一个dataframe中?
我想创建一个函数,它获取数据帧df1的行(列为x1、x2、x3),该函数的输出是数据帧df2的子集(列为y1、y2),该子集是根据df1行中的值计算的。我想对df1的每一行应用这个函数,并将df2的结果数据帧子集堆叠在一个大数据帧中。示例如何使用for循环执行此操作: df1的示例:如何根据dataframe1中的值从dataframe2生成子集,并将所有子集堆叠在R中的一个dataframe中?,r,dataframe,apply,R,Dataframe,Apply,我想创建一个函数,它获取数据帧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
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, ]
根据df1中的值,子集可以给出不同长度的数据帧,有时没有元素
问题是:如何在没有for循环的情况下编写向量化形式的子集和追加过程?看起来我们需要一个模糊连接
数据
看来我们需要一个模糊连接
数据
请给出一个小的可重复的示例和预期输出如果您的所有函数都对行进行过滤,那么将此应用于df1的每一行是非常低效的。最好以矢量化的方式进行过滤。正如akrun所建议的,如果您能稍微改进一下问题,例如dputheadx的输出和该示例的预期输出,这将非常有帮助。建议阅读:、和。@akrun编辑了问题并添加了可复制的示例请显示一个小的可复制示例和预期输出如果您的所有函数都对行进行过滤,则将此应用于df1的每一行确实效率低下。最好以矢量化的方式进行过滤。正如akrun所建议的,如果您能稍微改进一下问题,例如dputheadx的输出和该示例的预期输出,这将非常有帮助。建议阅读:、和。@akrun编辑了问题并添加了可复制的示例
y1 y2
a 4.0
a 3.5
b 9.8
b 9.5
a 10.0
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))