找出具有相同名称

时间:2017-08-25 04:07:07

标签: r

我的df看起来像

df <- data.frame(Name = c("A", "A","A","B", "B", "C", "D", "E", "E"), 
                 Value = c(1, 1, 1, 2, 15, 3, 4, 5, 5))

基本上,A是1,B是2,C是3,依此类推。 但是,如您所见,B有“2”和“15”。“15”是错误的值,它不应该在这里。

我想找出Value在同一名称中不匹配的行。 理想的输出看起来像

B  2
B  15

3 个答案:

答案 0 :(得分:1)

您可以使用tidyverse等功能:

df %>%
    group_by(Name, Value) %>% 
    unique()

,并提供:

    Name Value
1      A     1
2      B     2
3      B    15
4      C     3
5      D     4
6      E     5

然后,要仅保留Name多个Value,请在上面添加:

df %>%
  group_by(Name) %>%
  filter( n() > 1)

答案 1 :(得分:0)

这样的东西?这将搜索与多个值相关联的名称,并输出每对{Name - Value}的一个副本。

df <- data.frame(Name = c("A", "A","A","B", "B", "C", "D", "E", "E"), 
                 Value = c(1, 1, 1, 2, 15, 3, 4, 5, 5))

res <- do.call(rbind, lapply(unique(df$Name), (function(i){
  if (length(unique(df[df$Name == i,]$Value)) > 1 ) {
    out <- df[df$Name == i,]
    out[!duplicated(out$Value), ]
  }
})))
res

按预期结果

  Name Value
4    B     2
5    B    15

答案 2 :(得分:0)

   Filter(function(x)nrow(unique(x))!=1,split(df,df$Name))
$B
  Name Value
4    B     2
5    B    15 

或者:

Reduce(rbind,by(df,df$Name,function(x) if(nrow(unique(x))>1) x))

 Name Value
4    B     2
5    B    15