根据 R 中的条件旋转/连接/扩展数据帧

问题描述 投票:0回答:1

我正在努力解决以下问题,分别我能够通过循环 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 中最初的内容和不包含的内容)。

提前谢谢您, 非常感谢任何帮助。

奥托

r join pivot-table
1个回答
0
投票
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?

© www.soinside.com 2019 - 2024. All rights reserved.