如何输出重复的行

时间:2014-10-23 03:29:06

标签: r duplicates unique aggregate apply

我有以下数据:

x1  x2  x3  x4
34  14  45  53 
2   8   18  17
34  14  45  20
19  78  21  48 
2   8   18  5

在第1行和第3行;第2列和第5列的列X1; X2,X3的值相等。如何仅输出4行,数字相同?输出应采用以下格式:

x1  x2  x3  x4
34  14  45  53
34  14  45  20
2   8   18  17
2   8   18  5

如果不清楚,请问我问题。

其他问题:在输出中

x1  x2  x3  x4
34  14  45  53
34  14  45  20
2   8   18  17
2   8   18  5

在最后一栏中找到值的总和:

x1  x2  x3  x4
34  14  45  73
2   8   18  22

6 个答案:

答案 0 :(得分:7)

您可以使用duplicated来执行此操作,dat[,-4]会在传递矩阵时检查要复制的行。由于您只检查前三列,因此应将dat[duplicated(dat[,-4]) | duplicated(dat[,-4], fromLast=T),] # x1 x2 x3 x4 # 1 34 14 45 53 # 2 2 8 18 17 # 3 34 14 45 20 # 5 2 8 18 5 传递给该函数。

{{1}}

答案 1 :(得分:3)

使用ave的替代方案:

dat[ave(dat[,1], dat[-4], FUN=length) > 1,]

#  x1 x2 x3 x4
#1 34 14 45 53
#2  2  8 18 17
#3 34 14 45 20
#5  2  8 18  5

答案 2 :(得分:3)

前几天学会了这个。您不需要重新订购输出。

s <- split(dat, do.call(paste, dat[-4]))
Reduce(rbind, Filter(function(x) nrow(x) > 1, s))
#   x1 x2 x3 x4
# 2  2  8 18 17
# 5  2  8 18  5
# 1 34 14 45 53
# 3 34 14 45 20

答案 3 :(得分:0)

还有另一种方法可以使用两个包解决这两个问题。

library(DescTools)
library(dplyr)
dat[AllDuplicated(dat[1:3]), ] %>% # this line is to find duplicates
  group_by(x1, x2) %>% # the lines followed are to sum up
  mutate(x4 = sum(x4)) %>%
  unique()
# Source: local data frame [2 x 4]
# Groups: x1, x2
# 
#   x1 x2 x3 x4
# 1 34 14 45 73
# 2  2  8 18 22

答案 4 :(得分:0)

也可以使用table命令:

> d1 = ddf[ddf$x1 %in% ddf$x1[which(table(ddf$x1)>1)],]
> d2 = ddf[ddf$x2 %in% ddf$x2[which(table(ddf$x2)>1)],]
> rr = rbind(d1, d2)
> rr[!duplicated(rbind(d1, d2)),]
  x1 x2 x3 x4
1 34 14 45 53
3 34 14 45 20
2  2  8 18 17
5  2  8 18  5

最后一栏中的总和:

> rrt = data.table(rr2)
> rrt[,x4:=sum(x4),by=x1]
> rrt[rrt[,!duplicated(x1),]]
   x1 x2 x3 x4
1: 34 14 45 73
2:  2  8 18 22

答案 5 :(得分:0)

第一个与上面类似,让z成为你的data.frame:

 library(DescTools)
 (zz <- Sort(z[AllDuplicated(z[, -4]), ], decreasing=TRUE) )

 # now aggregate
 aggregate(zz[, 4], zz[, -4], FUN=sum)

 # use Sort again, if needed...