计算行中的元素并映射到r中的列

时间:2018-10-02 00:26:20

标签: r apply

我想通过对实体进行计数来汇总我的数据,并为每个实体创建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 功能?

2 个答案:

答案 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。它适用于yid的每种组合,以使用嵌套的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