1

我是一个 R 初学者,我需要能够计算数据框中值的百分比,但经常按其他列值“分组”。

我有一个大约 1000 行的数据框,包含媒体类型、版本、集合(= 年)和计数(今年)。我可以过滤它们,只得到一个特定的媒介:

trSpdf <- trS[trS$Mediatype == 'application/pdf',]

并获得以下示例输出:

> trSpdf 

        Mediatype Version Collection      Count
39 application/pdf      -1     co2008         2.0
40 application/pdf      -1     co2009         5.0
43 application/pdf       1     co2008         1.0
44 application/pdf       1     co2009         1.0
48 application/pdf     1.1     co2008        16.0
52 application/pdf     1.2     co2008        20.0
53 application/pdf     1.2     co2009        90.0
... (continuing) ...

我想要的是计算每个集合(= 年)的每个版本与此集合中所有版本相比的百分比,因此对于此示例,结果应该是:

5.12% of all versions in co2008 were version -1 (2.0 / total sum for co2008)
2.56% of all versions in co2008 were version 1 (1.0 / total sum for co2008)
...
93,75% of all versions in co2009 were version 1.2 (90.0 / total sum for co2009)
...

提前感谢您提供有关如何解决此问题的任何答案。

4

2 回答 2

1

您可以执行以下操作:

with(trSpdf, by(Version, Collection, FUN= function(x) round(prop.table(table(x))*100,2)))

您可以更改FUN为您希望输出的样子。

编辑:试试这个:

yearsums <- with(trSpdf, tapply(Count, Collection, sum))
mapply(FUN = function(x,y) x/yearsums[as.character(y)], trSpdf$Count, trSpdf$Collection)

不过,我确信有更好的方法。

于 2013-05-23T14:19:12.460 回答
1

首先,用于添加一个列,给出每个和ave的总计数:MediatypeCollection

trS <- transform(trS, Tot.Count = ave(Count, Mediatype, Collection, FUN = sum))

然后,很容易很明显地计算百分比:

trS <- transform(trS, percentage = 100 * Count/Tot.Count)

或者,如果您希望它的格式很好(例如“5.13%”),请使用sprintf

trS <- transform(trS, percentage = paste0(sprintf("%.2f", 100 * Count/Tot.Count),
                                          "%"))
于 2013-05-24T01:15:39.563 回答