我想通过对实体进行计数来汇总我的数据,并为每个实体创建counting_column。 让我们说: df:
id class
1 A
1 B
1 A
1 A
1 B
1 c
2 A
2 B
2 B
2 D
我想创建一个像这样的表
id A B C D
1 3 2 1 0
2 1 2 0 1
如何在R中使用 apply 功能?
答案 0 :(得分:3)
df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L),
class = structure(c(1L, 2L, 1L, 1L, 2L, 3L, 1L, 2L, 2L, 4L
), .Label = c("A", "B", "C", "D"), class = "factor")), .Names = c("id",
"class"), class = "data.frame", row.names = c(NA, -10L))
with(df, table(id, class))
# class
#id A B C D
# 1 3 2 1 0
# 2 1 2 0 1
xtabs(~ id + class, df)
# class
#id A B C D
# 1 3 2 1 0
# 2 1 2 0 1
tapply(rep(1, nrow(df)), df, length, default = 0)
# class
#id A B C D
# 1 3 2 1 0
# 2 1 2 0 1
答案 1 :(得分:1)
这似乎是一个很奇怪的要求,但是如果您坚持使用apply
,则函数count
会计算id
等于x
和{{ 1}}等于class
。它适用于y
和id
的每种组合,以使用嵌套的class
调用获得a
。最后,我们添加行和列的名称。
apply
给予:
uid <- unique(DF$id)
uclass <- unique(DF$class)
count <- function(x, y, DF) sum(x == DF$id & y == DF$class)
a <- apply(matrix(uclass), 1, function(u) apply(matrix(uid), 1, count, u, DF))
dimnames(a) <- list(uid, uclass)
我们将其用于> a
A B c D
1 3 2 1 0
2 1 2 0 1
DF