【问题标题】:Change values if some other observation is updated as well in R如果在 R 中也更新了其他一些观察值,则更改值
【发布时间】:2020-12-05 12:35:54
【问题描述】:

我将不胜感激以下方面的帮助。这是一些玩具数据:

df <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
                 V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
                 V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3))

这个想法是逐步将数据分成组g,将V2列中组内的最大值分配给新列y,在进度的每个步骤中使用 不太严格的标准。在这种情况下,有 2 个步骤。

匹配应该一直持续到每个组有 5 个元素,或者直到完成所有步骤。 第一步很简单——具有相同id1 的行应该属于同一个组:

df1 <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
                  V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
                  V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3),
                    g = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
                  y = c(2, 2, 7, 7, 7, 8, 8, 8, 8, 8))

对于第二步,我想将V1 彼此相距在 5 个单位以内的值配对在一起,或者在第 1 步中配对在一起。

df2 <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
                   V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
                   V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3),
                   g = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2),
                   y = c(7, 7, 7, 7, 7, 8, 8, 8, 8, 8)).

注意应该发生两件事:

  1. id1 = 1id2 = 2 的值被组合在一起。这应该是因为第二行和第三行:|10 - 5| &lt;= 5。但即使第 2 行和第 4 行或第 3 行和第 4 行不是这样,它们仍应分组在一起,因为在第一步中分组的观察结果在第二步中不应该是不匹配的。

  2. id1 = 3 的组没有变化,因为它已经有 5 个组件。

OBS:我不太关心每个组中的名字g,只关心y

我怎样才能运行一个代码,以使更大的数据集发生这种情况,包括更多的步骤和更复杂的 每个步骤的条件?

我知道如何独立执行每个分类,但不知道如何进行更新过程。我会优先使用tidyverse

【问题讨论】:

    标签: r function dplyr tidyr


    【解决方案1】:

    第一部分的答案可以使用dplyrtidyverse

    df <- data.frame(id1 = c(1, 1, 2, 2, 2, 3, 3, 3, 3, 3),
                     V1 = c(5, 10, 5, 15, 30, 1, 1, 1, 1, 1),
                     V2 = c(1, 2, 3, 2, 7, 4, 0, 8, 1, 3))
    
    df1 <- df1 %>% group_by(id1) %>% mutate(g= id1, y= max(V2))
    

    第二部分看不懂。

    【讨论】:

    • 我知道第一步,问题实际上是第二步。我已经详细一点了
    猜你喜欢
    • 1970-01-01
    • 2013-02-24
    • 2018-12-13
    • 2018-12-03
    • 1970-01-01
    • 2018-07-27
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多