4

我有两周的 R 经验,将感谢您的帮助。

我有一个用 count() 构建的数据表,我想按类别计算频率的百分比。所以如果这是我的数据框:

name cat1 cat2 freq
A       1   1   32
A       1   0   56
A       0   1   36
A       0   0   25
B       1   1   14
B       1   0   68
B       0   1   58
B       0   0   90

我想按名称和 cat1 计算百分比(cat2 = 1,0 是总数)。我有许多数据框,对于某些名称,它可能只有 cat1=0 和 cat2=0,并且由于结构不同,我不能直接做到这一点。

例如,第一行是 (32/(32+56))*100,第四行是 (25/(25+36))*100。

有任何想法吗?

谢谢

4

1 回答 1

13

您可能想尝试使用 data.table。如果使用大型表,您还可以获得速度优势。

library(data.table)
#if your data is already stored as a data frame, 
#you can always skip the next step and continue with data <- data.table(data)

data <- data.table(name=rep(c("A","B"), each=4), cat1=c(1,1,0,0,1,1,0,0), cat2=c(1,0,1,0,1,0,1,0), freq=c(32,56,36,25,14,68,58,90))
data[, percen := sum(freq), by=list(name,cat1)]
data[, percen := freq/percen]
data
> data
   name cat1 cat2 freq  percen
1:    A    1    1   32 0.3636364
2:    A    1    0   56 0.6363636
3:    A    0    1   36 0.5901639
4:    A    0    0   25 0.4098361
5:    B    1    1   14 0.1707317
6:    B    1    0   68 0.8292683
7:    B    0    1   58 0.3918919
8:    B    0    0   90 0.6081081

希望这可以帮助。

于 2013-08-27T14:56:51.407 回答