汇总由多个变量分组的 data.frame 中的计数

数据挖掘 r 数据争吵
2022-02-24 00:28:43

这是我目前正在处理的数据集的片段:

> sample
    name sex count
1  Maria   f    97
2 Thomas   m    12
3  Maria   m     5
4  Maria   f    97
5 Thomas   m     8
6  Maria   m     4

我想总结分组的计数namesex最终得到这个data.frame:

> result
    Maria Thomas
f   194      0
m     9     20

我写了一个简单的循环来遍历行并总结计数:

result <- matrix(0, nrow=2, ncol=2)
colnames(result) <- unique(sample$name)
rownames(result) <- unique(sample$sex)

for (i in 1:nrow(sample)) {
    sex <- as.character(sample[i,"sex"])
    name <- sample[i,"name"]
    count <- sample[i,"count"]

    result[sex, name] <- result[sex, name] + count
}

这样做是否合适?还有其他更优雅/更短的方式吗?

编辑:

我已经尝试过aggregate,但输出格式不同:

> aggregate(sample$count,by=list(sample$name,sample$sex),sum)
  Group.1 Group.2   x
1   Maria       m   9
2  Thomas       m  20
3   Maria       w 194
2个回答

您可以使用该xtabs功能执行此操作!这是我使用您的示例数据的方法:

# Create example data...
name <- c("Maria", "Thomas", "Maria", "Maria", "Thomas", "Maria")
sex <- c("f", "m", "m", "f", "m", "m")
count <- c(97, 12, 5, 97, 8, 4)
data <- data.frame("name"=name, "sex"=sex, "count"=count)

# Create table...
xtabs(formula=count~name + sex, data=data)

给出以下输出:

        sex
name       f   m
Maria    194   9
Thomas     0  20

使用data.table也是您可以探索的另一种选择。当您对表执行某些操作时,使用 data.tables 会更有效。它的使用也很简单。

require(data.table) 
DT <- data.table(data) 
DT[ , .(Totalcount = sum(count)), by = .(name,sex)]

输出

     name sex Totalcount
1:  Maria   f        194
2: Thomas   m         20
3:  Maria   m          9