我有一个非常大的数据框,其中包含其他变量,但是我想按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代码应在其自己的列中包含计数。
答案 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