我正在努力解决以下问题,分别我能够通过循环 liveDataset 的每一行并随时调用自定义函数来完成这项工作 - 但我的真实数据集非常巨大,所以我需要以“更多 R 方式”来完成此操作“以避免循环。
我尝试了在这里或其他地方建立的多种方法,仍然无法做到我需要的。
这是数据
liveDataset <-
data.frame(
Value1 =
c(
100, 110, 115, 108, 90, 95
),
Value2 =
c(
105, 108, 118, 103, 94, 104
),
PredValues =
c(
0.7, 1.6, 1.3, 0.1, 0.4, -0.6
)
)
controlDataset <-
data.frame(
Value1 =
c(
98, 111, 114, 109, 85, 95
),
Value2 =
c(
100, 108, 115, 103, 90, 104
),
PredValues =
c(
1, 2, 1, 0.5, -2, -0.3
)
)
desiredOutput <-
data.frame(
GroupId =
c(
1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3, 3, 3, 3, 3,
4, 4, 4, 4,
5, 5,
6, 6
),
Value1 =
c(
100, 98, 85, 95,
110, 98, 109, 85, 95,
115, 98, 111, 114, 109, 85, 95,
108, 98, 85, 95,
90, 85,
95, 85
),
Value2 =
c(
100, 103, 90, 104,
108, 100, 103, 90, 104,
118, 100, 108, 115, 103, 90, 104,
103, 100, 90, 104,
94, 90,
104, 90
),
PredValues =
c(
0.7, 1, -2, -0.3,
1.6, 1, 0.5, -2, -0.3,
1.3, 1, 2, 1, 0.5, -2, -0.3,
0.1, 1, -2, -0.3,
0.4, -2,
-0.6, -2
)
)
这只是手工制作的示例,这是我对问题的解释/描述。
我正在使用 liveDataset,对于每一行,我需要 subset controlDataset 并在 liveDataset 下方添加此子集。
这个手工制作例子中应用的条件是这样的
controlDataset %>%
filter(
Value1 < liveDataset$Value1 & Value2 < liveDataset$Value2
)
我在测试过的所有方法中遇到的困难是,这些方法不适用于单独的每一行(rowwise 没有帮助或不知道如何正确使用它)。
另一个问题是 desired GroupId 因为我现在真的无法想象如何在不循环的情况下处理这个问题。
有什么想法吗?
PS:我需要将 liveDataset 中的原始行作为组中的第一个(或者给它另一个标签/id,以便能够定义 liveDataset 中最初的内容和不包含的内容)。
提前谢谢您, 非常感谢任何帮助。
奥托
library(tidyverse)
map_dfr(1:nrow(liveDataset), \(x) bind_rows(liveDataset |> slice(x),
controlDataset |> filter(Value1 < liveDataset$Value1[x] & Value2 < liveDataset$Value2[x])) |>
mutate(GroupId = x, .before = 1))
GroupId Value1 Value2 PredValues
1 1 100 105 0.7
2 1 98 100 1.0
3 1 85 90 -2.0
4 1 95 104 -0.3
5 2 110 108 1.6
6 2 98 100 1.0
7 2 109 103 0.5
8 2 85 90 -2.0
9 2 95 104 -0.3
10 3 115 118 1.3
11 3 98 100 1.0
12 3 111 108 2.0
13 3 114 115 1.0
14 3 109 103 0.5
15 3 85 90 -2.0
16 3 95 104 -0.3
17 4 108 103 0.1
18 4 98 100 1.0
19 4 85 90 -2.0
20 5 90 94 0.4
21 5 85 90 -2.0
22 6 95 104 -0.6
23 6 85 90 -2.0
我在所需输出中少返回一行,即 GroupId 4 的最后一行,但我不确定是否应该包含这一行,因为 104>103?