删除R中具有相同列A值但不同于df(但反之亦然)的列B值不同的行

时间:2015-01-22 17:49:38

标签: r

我正在尝试删除数据框“lan”列中具有相同值的所有行,但我的“id”列的值不同(但反之亦然)。

使用示例数据集:

require(dplyr)
t <- structure(list(id = c(1L, 2L, 2L, 3L, 3L, 4L, 4L, 4L, 4L, 4L, 
                           4L), lan = structure(c(1L, 2L, 3L, 4L, 4L, 5L, 5L, 5L, 6L, 1L, 
                                                  7L), .Label = c("a", "b", "c", "d", "e", "f", "g"), class = "factor"), 
                    value = c(0.22988498, 0.848989831, 0.538065821, 0.916571913, 
                              0.304183372, 0.983348167, 0.356128559, 0.054102854, 0.400934593, 
                              0.001026817, 0.488452667)), .Names = c("id", "lan", "value"
                              ), class = "data.frame", row.names = c(NA, -11L))
t

我需要摆脱第1行和第10行,因为它们具有相同的局域网(a)但身份不同。

我尝试了以下内容,但没有成功:

a<-t[(!duplicated(t$id)),]
c<-a[duplicated(a$lan)|duplicated(a$lan, fromLast=TRUE),]
d<-t[!(t$lan %in% c$lan),]

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

另一种使用dplyr

的替代方案
t2 <- t %>% 
  group_by(lan,id) %>%
  summarise(value=sum(value)) %>%
  group_by(lan) %>%
  summarise(number=n()) %>%
  filter(number>1) %>%
  select(lan)

> t[!t$lan %in% t2$lan ,]
   id lan      value
2   2   b 0.84898983
3   2   c 0.53806582
4   3   d 0.91657191
5   3   d 0.30418337
6   4   e 0.98334817
7   4   e 0.35612856
8   4   e 0.05410285
9   4   f 0.40093459
11  4   g 0.48845267

答案 1 :(得分:1)

您可以在“lan”上使用duplicated来获取所有重复元素的逻辑索引,将两个列重复相同('id','lan'),以获取元素重复,检查这两个元素在两种情况下都是正确的,否定和子集。

indx1 <-  with(t, duplicated(lan)|duplicated(lan,fromLast=TRUE))
indx2 <- !(duplicated(t[1:2])|duplicated(t[1:2],fromLast=TRUE))
t[!(indx1 & indx2),]
#   id lan      value
#2   2   b 0.84898983
#3   2   c 0.53806582
#4   3   d 0.91657191
#5   3   d 0.30418337
#6   4   e 0.98334817
#7   4   e 0.35612856
#8   4   e 0.05410285
#9   4   f 0.40093459
#11  4   g 0.48845267