27

我有一个类似于以下示例的数据框

a = c(1, 1, 1, 2, 2, 3, 4, 4)
b = c(3.5, 3.5, 2.5, 2, 2, 1, 2.2, 7)
df <-data.frame(a,b)

我可以通过以下代码从 R 数据框中删除重复的行,但是如何找到每个重复行重复的次数?我需要将结果作为向量。

unique(df)

或者

df[!duplicated(df), ]
4

4 回答 4

33

这是使用ddply()库中的函数的解决方案plyr

library(plyr)
ddply(df,.(a,b),nrow)

  a   b V1
1 1 2.5  1
2 1 3.5  2
3 2 2.0  2
4 3 1.0  1
5 4 2.2  1
6 4 7.0  1
于 2013-08-13T05:17:56.420 回答
22

你总是可以用一块石头杀死两只鸟:

aggregate(list(numdup=rep(1,nrow(df))), df, length)
# or even:
aggregate(numdup ~., data=transform(df,numdup=1), length)
# or even:
aggregate(cbind(df[0],numdup=1), df, length)

  a   b numdup
1 3 1.0      1
2 2 2.0      2
3 4 2.2      1
4 1 2.5      1
5 1 3.5      2
6 4 7.0      1
于 2013-08-13T05:20:44.727 回答
14

这里有两种方法。

# a example data set that is not sorted
DF <-data.frame(replicate(sequence(1:3),n=2))

# example using similar idea to duplicated.data.frame
count.duplicates <- function(DF){
x <- do.call('paste', c(DF, sep = '\r'))
  ox <- order(x)
  rl <- rle(x[ox])
  cbind(DF[ox[cumsum(rl$lengths)],,drop=FALSE],count = rl$lengths)

}
count.duplicates(DF)
#   X1 X2 count
# 4  1  1     3
# 5  2  2     2
# 6  3  3     1


# a far simpler `data.table` approach
library(data.table)
count.dups <- function(DF){

  DT <- data.table(DF)
  DT[,.N, by = names(DT)]
}
count.dups(DF)
#    X1 X2 N
# 1:  1  1 3
# 2:  2  2 2
# 3:  3  3 1
于 2013-08-13T05:30:18.050 回答
12

使用 dplyr:

summarise(group_by(df,a,b),length(b))

或者

group_size(group_by(df,a,b))
#[1] 1 2 2 1 1 1
于 2014-09-16T20:05:19.007 回答