按列2 - R计算第1列的前4位

时间:2016-02-21 21:57:35

标签: r statistics

我是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

我需要从列#34; D"中计算前4位。 by" Res"所以期望的结果看起来像:

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

和%age:

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

由于

3 个答案:

答案 0 :(得分:3)

我们可以使用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))

答案 1 :(得分:2)

如果您的意思是每Res总计D,然后选择前4位总和(假设您犯了错误,计算dsdp的总和),您可以尝试:

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

答案 2 :(得分:1)

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