我有一个如下所示的数据表:
serialno state type type2
1 100 FL A C
2 100 CA A D
3 101 CA B D
4 102 GA A C
5 103 WA A C
6 103 PA B C
7 104 CA B D
8 104 CA B C
9 105 NY A D
10 105 NJ B C
我需要创建一个由serialno
聚合的新数据表,但计算每种类型的现有变量的计数。所以最终结果看起来像这样。
FL CA GA A B C D
100 1 1 2 1 1
101 1 1 1 1
102 1 1
103 1 1 1 1 2
104 2 2 1 1
105 1 1 1 1 1 1
我确定使用group_by
和summarize
的某种组合有一个解决方案,但我还没有能够解决这个问题。最简单的解决方案是首先展开state
,type
和type2
列,然后使用汇总来创建计数?
答案 0 :(得分:3)
使用:
library(reshape2)
recast(dat, serialno ~ value, id.var = 'serialno', fun.aggregate = length)
给出:
serialno A B C CA D FL GA NJ NY PA WA
1 100 2 0 1 1 1 1 0 0 0 0 0
2 101 0 1 0 1 1 0 0 0 0 0 0
3 102 1 0 1 0 0 0 1 0 0 0 0
4 103 1 1 2 0 0 0 0 0 0 1 1
5 104 0 2 1 2 1 0 0 0 0 0 0
6 105 1 1 1 0 1 0 0 1 1 0 0
或者:
library(dplyr)
library(tidyr)
dat %>%
gather(key, val, state:type2) %>%
group_by(serialno, val) %>%
tally() %>%
spread(val, n, fill = 0)
或者:
library(data.table)
dcast(melt(setDT(dat), id = 1), serialno ~ value, fun.aggregate = length)
或(根据@Frank&#39的建议):
res <- table(melt(dat, id="serialno")[, c("serialno","value")])
print(res, zero.print="")
其中最后一个导致:
value
serialno A B C CA D FL GA NJ NY PA WA
100 2 1 1 1 1
101 1 1 1
102 1 1 1
103 1 1 2 1 1
104 2 1 2 1
105 1 1 1 1 1 1