【问题标题】:Removing values if they duplicate in two subsequent rows如果值在随后的两行中重复,则删除它们
【发布时间】:2014-10-01 17:28:30
【问题描述】:

我有一个数据框

dat <- data.frame(time = c(24.83,25.24,25.46,25.71,25.78,26.11), key = c("z","f","x","f","f","x"))

看起来像这样:

time    key
24.83   z
25.24   f
25.46   x
25.71   f
25.78   f
26.11   x

我想在随后的两行中查找“key”的值相同的所有实例(如此处的“f”)并删除第二行。

我查看了 ?duplicated 和 ?unique,但仍然不知道如何将其应用于此目的。

【问题讨论】:

    标签: r


    【解决方案1】:

    duplicatedunique 可能不是这里的最佳选择——默认情况下它们会删除所有后续重复项。

    相反,您可以使用rle,如下所示:

    > dat[sequence(rle(as.character(dat$key))$lengths) == 1, ]
       time key
    1 24.83   z
    2 25.24   f
    3 25.46   x
    4 25.71   f
    6 26.11   x
    

    rle 返回带有两个项目的listlengths(表示运行长度)和values

    【讨论】:

    • 谢谢。它有效,尽管我不理解 as.character(dat$key))$lengths 的含义。因此,如果我希望函数在 'z' 在随后的两行中重复时忽略实例,我应该执行 dat[sequence(rle(as.character(dat[dat$key != "z", "key"]) )$lengths) == 1, ] ??
    【解决方案2】:

    这是一个different 解决方案:

    dat[-(which(diff(as.numeric(dat$key))==0)+1),]
    
       time key
    1 24.83   z
    2 25.24   f
    3 25.46   x
    4 25.71   f
    6 26.11   x
    

    【讨论】:

    • +1 为您聪明的 abuse 语法高亮 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2020-01-15
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多