R - 删除在data.frame中出现多次的变量组合

时间:2016-04-01 12:18:49

标签: r duplicates

假设我有一个数据框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 } }

  4. 我的预期输出是:

    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))
    

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

以下是使用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

答案 2 :(得分:0)

这应该做。我创建了一个样本数据集,添加了索引向量以显示您只保存了颜色用户出现的第一个出现。这是你的rownames是实际的行号。

## 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))]

答案 3 :(得分:0)

一种简单的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

答案 4 :(得分:0)

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

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

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