根据一列的行数创建新的计数列

时间:2019-05-03 15:44:42

标签: r

我有一个非常大的数据框,其中包含其他变量,但是我想按id折叠此数据框,并使用obj代码的频率计数创建新列。

这是我的数据框的一部分。

sort

这是我想要的输出:

id <- c("Adam", "Adam", "Adam", "Adam", "Adam", "Adam", "John", "John", "John", "Kim")
obj <- c("21", "21", "22", "23", "24", "25", "25", "27", "28", "28")
df <- data.frame(id, obj)

我想计算每个人(id)的obj代码(obj)出现的次数。每个obj代码应在其自己的列中包含计数。

2 个答案:

答案 0 :(得分:0)

一个选项是table

table(df)
#      obj
#id     21 22 23 24 25 27 28
#  Adam  2  1  1  1  1  0  0
#  John  0  0  0  0  1  1  1
#  Kim   0  0  0  0  0  0  1

或使用tidyverse

library(tidyverse)
df %>%
   count(id, obj) %>%
   mutate(obj = str_c("obj", obj)) %>%
   spread(obj, n, fill = 0)
# A tibble: 3 x 8
#  id    obj21 obj22 obj23 obj24 obj25 obj27 obj28
#  <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Adam      2     1     1     1     1     0     0
#2 John      0     0     0     0     1     1     1
#3 Kim       0     0     0     0     0     0     1

答案 1 :(得分:0)

使用data.table

library(data.table)
dcast(df, id ~ paste0("obj", obj), value.var = "obj", fun.aggregate = length)

    id obj21 obj22 obj23 obj24 obj25 obj27 obj28
1 Adam     2     1     1     1     1     0     0
2 John     0     0     0     0     1     1     1
3  Kim     0     0     0     0     0     0     1