我有以下数据集,我正在尝试修剪(数据框示例如下)
索引 | 年级 |
---|---|
Ace_1_1 | A |
Ace_1_1 | A |
Ace_1_1 | 乙 |
Ace_1_1 | C |
Ace_1_2 | A |
Ace_1_2 | C |
Ace_1_2 | C |
Ace_1_3 | 乙 |
Ace_1_3 | 乙 |
Ace_2_2 | C |
Ace_2_2 | A |
Ace_2_2 | 乙 |
Ace_2_5 | C |
Ace_2_5 | C |
Ace_2_5 | A |
Ace_2_5 | A |
Ace_3_1 | D |
df2 = structure(list(Index = c("Ace_1_1", "Ace_1_1", "Ace_1_1", "Ace_1_1",
"Ace_1_2", "Ace_1_2", "Ace_1_2", "Ace_1_3", "Ace_1_3", "Ace_2_2",
"Ace_2_2", "Ace_2_2", "Ace_2_5", "Ace_2_5", "Ace_2_5", "Ace_2_5",
"Ace_3_1"), Grade = c("A", "A", "B", "C", "A", "C", "C", "B",
"B", "C", "A", "B", "C", "C", "A", "A", "D")), class = "data.frame", row.names = c(NA,-17L))
我正在尝试对其进行缩减,以便对于每个索引,只显示最常见的等级。如果频率相同,则会显示并列的成绩。如果只有一个条目,也会显示该条目。上表的理想输出是
索引 | 年级 |
---|---|
Ace_1_1 | A |
Ace_1_2 | C |
Ace_1_3 | 乙 |
Ace_2_2 | C |
Ace_2_2 | A |
Ace_2_2 | 乙 |
Ace_2_5 | C |
Ace_2_5 | A |
Ace_3_1 | D |
我通过使用 mutate (Frequency = n()) 计算频率来使用 group_by() 函数,但我无法对最频繁的计数进行子集化。感谢是否有人可以使用 dplyr 或什至 base R 帮助我在这里计数,谢谢!
使用 data.table 或 dplyr,您可以简单地获取每组中计数等于最大计数的行:
library(dplyr)
count(df2,Index,Grade) %>% filter(n==max(n), .by=Index) %>% select(-n)
或
library(data.table)
setDT(df2)[, .N, .(Index, Grade)][, .SD[N==max(N), Grade], Index]
输出:
Index Grade
<char> <char>
1: Ace_1_1 A
2: Ace_1_2 C
3: Ace_1_3 B
4: Ace_2_2 A
5: Ace_2_2 B
6: Ace_2_2 C
7: Ace_2_5 A
8: Ace_2_5 C
9: Ace_3_1 D
您可以为每个Index
计算
统计模式,并保留只出现最频繁的行。然后,您可以使用
distinct
只保留唯一的。
library(dplyr)
Modes <- function(x) {
ux <- unique(x)
tab <- tabulate(match(x, ux))
ux[tab == max(tab)]
}
df2 %>%
filter(Grade %in% Modes(Grade), .by = Index) %>%
distinct(Index, Grade)
# Index Grade
#1 Ace_1_1 A
#2 Ace_1_2 C
#3 Ace_1_3 B
#4 Ace_2_2 C
#5 Ace_2_2 A
#6 Ace_2_2 B
#7 Ace_2_5 C
#8 Ace_2_5 A
#9 Ace_3_1 D