【问题标题】:Subset by first and last value per group每组的第一个和最后一个值的子集
【发布时间】:2015-08-05 13:05:38
【问题描述】:

我在 R 中有一个包含两列 temptimeStamp 的数据框。数据定期具有 temp 值。数据框的一部分看起来像 -

我必须创建显示温度随时间变化的折线图。从这里可以看出,temp 值在多个timeStamp 中保持不变。拥有这些重复值会增加数据文件的大小,我想删除它们。所以输出应该是这样的-

仅显示发生变化的值。 想不出在 R 中完成这种想法的方法。任何正确方向的输入都会非常有帮助。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    这是dplyr 解决方案:

    # Toy data
    df <- data.frame(time = seq(20), temp = c(rep(60, 5), rep(61, 7), rep(59, 3), rep(60, 5)))
    
    # Now filter for the first and last rows and ones bracketing a temperature change
    df %>% filter(temp!=lag(temp) | temp!=lead(temp) | time==min(time) | time==max(time))
    
      time temp
    1    1   60
    2    5   60
    3    6   61
    4   12   61
    5   13   59
    6   15   59
    7   16   60
    8   20   60
    

    如果数据按第三列(id)分组,只需在过滤步骤前添加group_by(id) %&gt;%即可。

    【讨论】:

    • 感谢您的回答。如果我按温度分组,则有一些温度值与组中的温度值相同,但发生在稍后的时间(在温度发生一些变化之后),所以这不会有帮助。因此,我在所有值上运行一个循环,并只选择那些温度发生变化的值到一个新的数据帧中。感谢您的回复:)
    • 我不明白你在说什么。您不需要按温度分组。
    • 单独的 id 列可以帮助解决这个问题
    【解决方案2】:

    一个选项是使用data.table。我们将“data.frame”转换为“data.table”(setDT(df1))。按“temp”分组,我们对每组的第一个和最后一个观察值 (.SD[c(1L, .N)]) 进行子集化。如果每个组只有一个值,我们就按原样取行 (else .SD)。

    library(data.table)
    setDT(df1)[, if(.N>1) .SD[c(1L, .N)] else .SD, by =temp]
    #    temp val
    #1: 22.50   1
    #2: 22.50   4
    #3: 22.37   5
    #4: 22.42   6
    #5: 22.42   7
    

    base R 选项与duplicated。我们检查'temp' 中的duplicated 值(输出是一个逻辑向量),并从反面检查重复(fromLast=TRUE)。使用&amp; 查找在这两种情况下为TRUE 的元素,取反(!) 并将'df1' 的行作为子集。

    df1[!(duplicated(df1$temp) & duplicated(df1$temp,fromLast=TRUE)),]
    #   temp val
    #1 22.50   1
    #4 22.50   4
    #5 22.37   5
    #6 22.42   6
    #7 22.42   7
    

    数据

    df1 <- data.frame(temp=c(22.5, 22.5, 22.5, 22.5, 22.37,22.42, 22.42), val=1:7)
    

    【讨论】:

    • 感谢您的回答。如果我按温度分组,则有一些温度值与组中的温度值相同,但发生在稍后的时间(在温度发生一些变化之后),所以这不会有帮助。因此,我在所有值上运行一个循环,并只选择那些温度发生变化的值到一个新的数据帧中。感谢您的回复:)
    • @ZeeshanAKhan 它基于您展示的示例。如果它不是预期的输出,您应该更改您的示例和预期的输出。另外,考虑发布 dput 输出而不是图像
    • 如果您创建一个 id 列并按 id 和 temp 分组,那么它们将始终是唯一的。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2017-07-28
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    相关资源
    最近更新 更多