【问题标题】:R - Remove combinations of variables that occur more than once in a data.frameR - 删除在 data.frame 中多次出现的变量组合
【发布时间】:2016-04-01 12:18:48
【问题描述】:

假设我有一个数据框df,其中包含三个向量:

  colours   individual value
1   white individual 1   0.4
2   white individual 1   0.7
3   black individual 2   1.1
4   black individual 3   0.5

有时,同一个人多次出现相同颜色但值不同的情况。我想编写一些代码来删除所有发生这种情况的实例。

***编辑:行数超过 4 - 数百万 - 我认为当前的解决方案行不通。

我想计算我当前所在的字符串在我的 for 循环中出现了多少次,然后从 data.frame 中删除它们。所以在上面的例子中,我想去掉个体 1。然后 df 会留下另外两行。

到目前为止,我的方法是这样的:

  1. 获取所有颜色的列表

  2. 获取所有个人的列表

  3. 写两个 for 循环。

    colours <- unique(df$colours) ind <- unique(df$individual) for (i in ind) { for (c in colour) { #something here. Probably if, asking if the person I'm on in the loop #is found with the colour I am on, more than once, get rid of them } }

我的预期输出是这样的:

colours  individual   value

black   individual 2   1.1

black   individual 3   0.5

源数据

df <- data.frame(colours = c("white", "white", "black", "black"),
                 individual = c("individual 1", "individual 1", "individual 2", "individual 3"),
                 value = c(0.4, 0.7, 1.1, 0.5))

【问题讨论】:

  • 你能用预期的输出更新吗
  • 感谢您的建议,mtoto。除非有另一个具有不同值的向量,否则这将起作用。我不知道哪个值是正确的,所以我试图删除我为相同颜色的同一个人找到两个值的地方。我将把它编辑成问题,因为我刚刚注意到这会使事情变得复杂。
  • 有人可以取消将此标记为重复吗?它不是。行不同。我改变了问题以反映这一点。抱歉之前的困惑。
  • 好的,我只是关注 mtoto 的链接。如果不是这种情况,我将取消标记。但是,我会说duplicated(...)|duplicated(..., fromLast=TRUE) 是骗子。
  • 在我看来仍然是重复的,只需要像df[!(duplicated(df[1:2]) | duplicated(df[1:2], fromLast = TRUE)), ]中那样指定cols

标签: r duplicates


【解决方案1】:

您可以尝试使用 dplyr 库中的 anti_join()

library(dplyr)
anti_join(df1, df1[duplicated(df1[1:2]),], by="individual")
#  colours   individual value
#1   black individual 3   0.5
#2   black individual 2   1.1

【讨论】:

  • 嗨,这是否不仅摆脱了前两行?我猜是为了让它遍历我需要修改的所有行,所以我摆脱它只应用于前两列?
  • @Gotmadstacks 它应该消除 data.frame 中的任何行,其中第一列和第二列中的条目组合出现多次。
【解决方案2】:

一个简单的dplyr 方法是根据需要进行分组并过滤出少于 2 个观察值的组:

library(dplyr)
df %>%
  group_by(colours, individual) %>%
  filter(n() < 2)

Source: local data frame [2 x 3]
Groups: colours, individual [2]

  colours   individual value
   (fctr)       (fctr) (dbl)
1   black individual 2   1.1
2   black individual 3   0.5

【讨论】:

    【解决方案3】:

    这是另一个使用data.table的选项

    library(data.table)
    setDT(df1)[, if(.N==1) .SD , .(colours, individual)]
    #   colours   individual value
    #1:   black individual 2   1.1
    #2:   black individual 3   0.5
    

    【讨论】:

      【解决方案4】:

      根据 cmets 中的一些建议,这个答案效果最好:

      df[!(duplicated(df[,1:2]) | duplicated(df[,1:2], fromLast = TRUE)), ]

      与 cmets 略有不同。这指定了列而不是行,因此可以从问题中获得我想要的结果(删除那些个人和颜色重复的行)。通常更有用,因为问题中的示例数据只有四行,而不是数百万行。

      【讨论】:

      • 这是最简单的方法,无需导入任何包。
      【解决方案5】:

      这应该可以。我创建了一个示例数据集,添加了索引向量以显示您仅保存第一次出现的颜色用户出现。这是有效的,你的行名是实际的行号。

      ## Data preparation
      colours <- sample(c("red","blue","green","yellow"), size = 50, replace = T)
      users <- sample(1:10, size=50, replace=T )
      df <- data.frame(colours,users)
      df$value <- runif(50)
      df$index <- 1:50
      
      ## Keep only the first occurence
      res <- unique(df[,1:2])
      res$values <- df$value[as.integer(rownames(res))]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-31
        • 2015-01-14
        • 1970-01-01
        • 2013-08-20
        • 2022-11-12
        • 2021-05-01
        • 2020-10-08
        相关资源
        最近更新 更多