R:基于最常见的列条目修剪数据框

问题描述 投票:0回答:2

我有以下数据集,我正在尝试修剪(数据框示例如下)

索引 年级
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 帮助我在这里计数,谢谢!

r dataframe dplyr group-by data-manipulation
2个回答
2
投票

使用 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

2
投票

您可以为每个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
© www.soinside.com 2019 - 2024. All rights reserved.