【问题标题】:R - subset column based on condition on duplicate rowsR - 基于重复行条件的子集列
【发布时间】:2014-10-30 04:53:11
【问题描述】:

我有一个带有重复的 id 列的数据框,其中包含站点计数。我想知道如何仅在 Site_Count 记录大于 0 时删除重复的 ID 记录。

生成 DF:

DF <- data.frame(
    'ID' = sample(100:300, 100, replace=T),
    'Site_count' = sample(0:1, 100, replace=T)
)

我对子集的尝试:

subset(DF[!duplicated(DF$ID),], site_count > 0)

但在这种情况下,它将删除所有 0 个站点计数 - 我希望仅在有超过 0 个站点计数的重复记录时才删除记录。

理想的结果看起来像这样(请注意,站点 ID 为 0,但没有重复的 ID 为 0 和另一个站点计数):

ID    site count
--    ----------
1        0
2        1
3        1
4        0
5        5

【问题讨论】:

  • 你想要subset(DF, !duplicated(p_id) &amp; site_count &gt; 0)吗?还是仅当重复的 id 具有 site_count &gt; 0 时才删除重复项?
  • @Roland - 是的 - 我只想在 ID 的 site_count > 0 时删除重复项,如果没有重复项,我想将该 ID 保留为 0 site_count。
  • 这并不能真正回答我的问题。请尽可能准确。

标签: r duplicates subset


【解决方案1】:

预期的输出不是很清楚。可能会有所帮助:

 indx <- with(DF, ave(!Site_count, ID, FUN=function(x) sum(x)>1))
 DF[!(duplicated(DF$ID) & indx),]

更新

重新阅读描述后,您的预期答案也可能是:

 indx <- with(DF, ave(Site_count, ID, FUN=function(x) any(x>0)))
 DF[!(duplicated(DF$ID) & indx),]

【讨论】:

  • 谢谢@akrun,ave() 很有用
【解决方案2】:

可能是这样的:

set.seed(42)
DF <- data.frame(
  'ID' = c(sample(1:3, 10, replace=T), 4),
  'Site_count' = c(sample(0:3, 10, replace=T), 0)
)

#   ID Site_count
#1   3          1
#2   3          2
#3   1          3
#4   3          1
#5   2          1
#6   2          3
#7   3          3
#8   1          0
#9   2          1
#10  3          2
#11  4          0


fun <- function(x) {
  if (length(x) == 1L) return(x) else {
    return(x[which.max(x > 0)])
  }
}
library(plyr)
ddply(DF, .(ID), summarise, Site_count = fun(Site_count))
#  ID Site_count
#1  1          3
#2  2          1
#3  3          1
#4  4          0

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多