Подсчет элементов в строках и отображение в столбец в r - PullRequest
0 голосов
/ 02 октября 2018

Я хотел бы суммировать мои данные путем подсчета сущностей и создания 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 function?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Это кажется очень странным требованием, но если вы настаиваете на использовании apply, то функция count считает количество строк, для которых id равно x и 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

Lines <- "id   class
1     A
1     B
1     A
1     A
1     B
1     c
2     A
2     B
2     B
2     D"
DF <- read.table(text = Lines, header = TRUE)
0 голосов
/ 02 октября 2018
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
...