通过第 2 列计算第 1 列的前 4 - R

Calculating top 4 of column 1 by column 2 - R

我是 R 的新手,老实说不知道如何调用我要找的东西:)

我有数据集 "ds" 设置了 2 列:

D  | res
==========
Ds  20
Dx  23
Dp  1
Ds  12
Ds  23
Ds  54
Dn  65
Ds  122
Dx  11
Dx  154
Dx  18
Do  4
Df  17
Dp  5
Dp  107
Dp  8
Df  3
Dp  33
Dd  223
Dc  7
Dv  22
Du  34
Dh  22
Ds  12
Dy  78
Dd  128

我需要根据 "Res" 计算第 "D" 列的前 4 名,因此所需结果如下所示:

D | Res
========
Dd  351
Dp  154
Ds  243
Dx  206

年龄百分比:

D  | % Of Total
==========
Dd  29.10%
Dp  12.77%
Ds  20.15%
Dx  17.08%

谢谢

如果你想对每个 D 求和 Res 然后 select 前 4 个总和(假设你在计算 ds 和 [=14 的总和时犯了错误=]) 你可以试试:

library(dplyr)
df1 %>% mutate(per = Res/sum(Res)) %>% group_by(D) %>% summarise(Res = sum(Res), perc = sum(per)) %>% top_n(4, Res)
Source: local data frame [4 x 3]

       D   Res      perc
  (fctr) (int)     (dbl)
1     Dd   351 0.2910448
2     Dp   154 0.1276949
3     Ds   243 0.2014925
4     Dx   206 0.1708126

我们可以使用 aggregate() 来获取每个类型的总和 "D",我们可以引入一个新的列来计算 OP 的编辑并包括百分比。

为了以所需的形式显示结果,我们可以应用 order() 函数根据 Res 的值重新排列行。在这种情况下,函数 rev() 确保最高值放在最前面,参数 4 的 head() 显示前四行。

summarized <- aggregate(Res ~. , df1, sum)
summarized$Perc <- with(summarized, paste0(round(Res/sum(Res)*100,2),"%"))
head(summarized[rev(order(summarized$Res)),],4)
   D  Res   Perc
2  Dd 351  29.1%
8  Ds 243 20.15%
11 Dx 206 17.08%
7  Dp 154 12.77%

数据

df1 <- structure(list(D = structure(c(8L, 11L, 7L, 8L, 8L, 8L, 5L, 
8L, 11L, 11L, 11L, 6L, 3L, 7L, 7L, 7L, 3L, 7L, 2L, 1L, 10L, 9L, 
4L, 8L, 12L, 2L), .Label = c("Dc", "Dd", "Df", "Dh", "Dn", "Do", 
"Dp", "Ds", "Du", "Dv", "Dx", "Dy"), class = "factor"), Res = c(20L, 
23L, 1L, 12L, 23L, 54L, 65L, 122L, 11L, 154L, 18L, 4L, 17L, 5L, 
107L, 8L, 3L, 33L, 223L, 7L, 22L, 34L, 22L, 12L, 78L, 128L)), 
.Names = c("D", "Res"), class = "data.frame", row.names = c(NA, -26L))

选项使用 data.table

library(data.table)
out = setorder(setDT(data)[, .(tmp = sum(res)), by = D]
                 [, .(D, ptg = (tmp/sum(tmp))*100)], -ptg)[1:4,]

#> out
#    D      ptg
#1: Dd 29.10448
#2: Ds 20.14925
#3: Dx 17.08126
#4: Dp 12.76949