如何计算数据框中的唯一行?

Posted

技术标签:

【中文标题】如何计算数据框中的唯一行?【英文标题】:How to Count Unique rows in a data frame? 【发布时间】:2018-12-18 17:30:09 【问题描述】:

我在 R 中有一个数据框,其中有很多重复的记录。我有兴趣找出每个数据框中有多少条记录。

例如,我有这个数据框:

Fake Name       Fake ID    Fake Status   Fake Program
June             0003         Green        PR1
June             0003         Green        PR1
Television       202          Blue         PR3
Television       202          Green        PR3    
Television       202          Green        PR3
CRT              12           Red          PR0

从上面我想得到类似于下面的东西:

Fake Name       Fake ID    Fake Status   Fake Program     COUNT
June             0003         Green        PR1              2
Television       202          Blue         PR3              1
Television       202          Green        PR3              2
CRT              12           Red          PR0              1

任何帮助将不胜感激。谢谢。

【问题讨论】:

unique(DF) 向我返回在我的 df 中找到的唯一行的列表。我需要计算一个唯一值出现在我的实际 df 旁边的频率。 【参考方案1】:

在基础 R 中,table 函数提供数据框中每个因子组合的表格多路计数。然后可以将结果转换为与您的原始结构相匹配的数据框,并添加一个包含计数的“频率”列。

data.frame(table(df))

#    Fake.Name Fake.ID Fake.Status Fake.Program Freq
#1         CRT    0003        Blue          PR0    0
#2        June    0003        Blue          PR0    0
#3  Television    0003        Blue          PR0    0
#4         CRT      12        Blue          PR0    0

当然,可能不需要每个组合,因此您可以将其限制为具有正数的行:

subset(data.frame(table(df)), Freq > 0)

#    Fake.Name Fake.ID Fake.Status Fake.Program Freq
#22        CRT      12         Red          PR0    1
#38       June    0003       Green          PR1    2
#63 Television     202        Blue          PR3    1
#72 Television     202       Green          PR3    2

【讨论】:

【参考方案2】:

你可以使用:

n_distinct(data$col)

【讨论】:

这似乎更像是评论而不是答案。见How to Answer。您可能需要建立更多的声誉才能评论 Stack Overflow ***.com/help/privileges/comment【参考方案3】:

下面使用duplicated获取结果data.frame,然后rle获取计数。

res <- dat[!duplicated(dat), ]

d <- duplicated(dat) | duplicated(dat, fromLast = TRUE)
res$COUNT <- rle(d)$lengths

res
#   Fake Name Fake ID Fake Status Fake Program COUNT
#1       June    0003       Green          PR1     2
#3 Television     202        Blue          PR3     1
#4 Television     202       Green          PR3     2
#6        CRT      12         Red          PR0     1

【讨论】:

【参考方案4】:

使用group_by_all,然后用n统计行数:

df %>% group_by_all() %>% summarise(COUNT = n())

# A tibble: 4 x 5
# Groups:   Fake.Name, Fake.ID, Fake.Status [?]
#  Fake.Name  Fake.ID Fake.Status Fake.Program COUNT
#  <fct>        <int> <fct>       <fct>        <int>
#1 CRT             12 Red         PR0              1
#2 June             3 Green       PR1              2
#3 Television     202 Blue        PR3              1
#4 Television     202 Green       PR3              2

@Ryan 的评论甚至更好:

df %>% group_by_all %>% count

【讨论】:

【参考方案5】:

问题

如何计算数据框中的唯一行数?

然后使用sumduplicated。例如,

df <- data.frame(
  `Fake Name` = c(
    "June", "June", "Television", "Television", "Television", "CRT"),
  `Fake ID` = c("0003", "0003", "202", "202", "202", "12"),
  `Fake Status` = c("Green", "Green", "Blue", "Green", "Green", "Red"),
  `Fake Program` = c("PR1", "PR1", "PR3", "PR3", "PR3", "PR0"), 
  check.names = FALSE)
df
#R    Fake Name Fake ID Fake Status Fake Program
#R 1       June    0003       Green          PR1
#R 2       June    0003       Green          PR1
#R 3 Television     202        Blue          PR3
#R 4 Television     202       Green          PR3
#R 5 Television     202       Green          PR3
#R 6        CRT      12         Red          PR0
sum(!duplicated(df))
#R [1] 4

对于您请求的表格,您可以使用data.table,如下所示

library(data.table)
df <- data.table(df)
df[, .(COUNT = .N), by = names(df)]
#R     Fake Name Fake ID Fake Status Fake Program COUNT
#R 1:       June    0003       Green          PR1     2
#R 2: Television     202        Blue          PR3     1
#R 3: Television     202       Green          PR3     2
#R 4:        CRT      12         Red          PR0     1

【讨论】:

以上是关于如何计算数据框中的唯一行?的主要内容,如果未能解决你的问题,请参考以下文章