如何计算数据框中的唯一行?
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】:问题
如何计算数据框中的唯一行数?
然后使用sum
和duplicated
。例如,
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
【讨论】:
以上是关于如何计算数据框中的唯一行?的主要内容,如果未能解决你的问题,请参考以下文章