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

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

【讨论】:

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

在 Pandas 数据框中查找唯一值,无论行或列位置如何

地图距离矩阵:如何迭代数据框中的行序列并计算距离

从数据框中的列中采样唯一行而不进行替换

像 Qlik 一样计算 pandas 数据框中的列中的唯一值?

如何根据日期时间约束从另一个数据框中提取行?

如何获取数据框中的所有唯一词?