【发布时间】: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/5963269、stackoverflow.com/help/mcve 和 stackoverflow.com/tags/r/info。 -
@akrun 编辑了问题并添加了可重复的示例