【问题标题】:Removing repeated rows with each interval from data.frame in R从R中的data.frame中删除每个间隔的重复行
【发布时间】:2012-06-20 09:29:26
【问题描述】:

我需要帮助删除 data.frame 的相同间隔值中的所有重复行。

例如,我有一个 data.frame 像:

Time                X   Y   Z
01/01/2011 00:00    101 200 302
01/01/2011 00:05    101 200 302
01/01/2011 00:10    101 200 302
01/01/2011 00:20    100 200 303
01/01/2011 00:25    100 200 303
01/01/2011 00:30    100 200 303
01/01/2011 00:35    101 200 302
01/01/2011 00:40    100 200 303
01/01/2011 00:45    100 200 303

在删除重复的行值 (x,y,z) 后,我将得到如下结果:

Time                X   Y   Z
01/01/2011 00:00    101 200 302
01/01/2011 00:20    100 200 303
01/01/2011 00:35    101 200 302
01/01/2011 00:40    100 200 303

我尝试过的:唯一或重复的功能,但它们给出了不同的结果。

前/eliminate <- data[!duplicated(data[,c("X","Y","Z")]),]

此代码只是删除所有 data.frame 中的所有重复值。

有人可以帮我找到解决办法吗?

谢谢,问候,

尤吉兹

【问题讨论】:

  • dups = df[duplicated(df[,2:4]),]nodups = df[!(duplicated(df[,2:4])),] 为我工作。你能告诉我们你在使用duplicated()函数时得到了什么吗?
  • 只获取唯一的项目。渴望的不是那个,而是重复项目中的第一个项目。

标签: r dataframe


【解决方案1】:

以下代码使您感兴趣的三列成为一个向量。然后,我只是测试向量之间的相等性和它的偏移量 1。当它为假时,你已经过渡到一个新的 XYZ 项目。

n <- nrow(ss)
xyz <- with(ss, paste0(X, Y, Z))
sel <- xyz[1:(n-1)] !=  xyz[2:n]
ss[c(TRUE,sel),] #the first one would always be true

这比 Julius 的答案快大约 3 倍。随着数据集的增长,优势应该会变得更大。

【讨论】:

    【解决方案2】:

    可能不是最优雅的方式:

    data  <- within(data, C <- paste(X, Y, Z, sep = ""))
    rl <- rle(data$C)$lengths
    data <- data[c(1, cumsum(rl)[-length(rl)] + 1), 1:(ncol(data)-1)]
    

    【讨论】:

    • 感谢@Julius 的帮助,它的工作原理并给我们预期的结果.. 好吧,我不知道最优雅的方式如何.. 但是,这已经很好了.. ;)
    猜你喜欢
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2021-06-07
    • 1970-01-01
    • 2016-05-03
    相关资源
    最近更新 更多