[英]frequency table with dplyr in r
我有這個:
set.seed(123)
class = c("A", "B", "C", "D")
have <- data.frame(ID = c(1:12), CLUSTER = rep(1:4, 3), VAL = sample(class, 12, replace = TRUE))
我要這個:
want <- data.frame(CLUSTER = c(1,2,3,4), D = c(2, 2, 0, 2), C = c(0, 1, 0, 0), A = c(1, 0, 2, 0), B = c(0, 0, 1, 1))
我想用dplyr
來做這dplyr
因為我的原始數據中有其他列我想總結一下。
我正在尋找類似的東西:
have %>% group_by(CLUSTER) %>% table(VAL) %>% summarize(sum(OTHER_VARS)) %>% mutate(OTHER_VARS)
我知道我可以在dplyr
使用table
或xtabs
或count
,但它要么丟失數據框類,要么將數據轉換為 long 而不是寬。
謝謝。
我懷疑有一種方法可以用dplyr
處理這個dplyr
,但這里有一個使用reshape2
的解決方案。
library(reshape2)
set.seed(123)
class <- c("A", "B", "C", "D")
have <- data.frame(ID = c(1:12),
CLUSTER = rep(1:4, 3),
VAL = sample(class, 12, replace = TRUE))
dcast(have, CLUSTER ~ VAL)
我相信這符合您的想法; dcast()
返回一個data.frame
對象。 但是再一次, dplyr
可能也可以輕松處理這個問題。
並不是說dplyr
有什么問題,但我認為您可以使用table
來獲得data.frame
解決方案:
> t1 <- table(have$CLUSTER, have$VAL) #create using table()
A B C D
1 0 1 1 1
2 1 1 0 1
3 0 1 1 1
4 0 1 0 2
> t1 <- data.frame(t1) #convert to data.frame
Var1 Var2 Freq
1 1 A 0
2 2 A 1
.....
15 3 D 1
16 4 D 2
> t1 <- reshape(t1, idvar = 'Var1', timevar = 'Var2', direction = 'wide') #convert to wide
Var1 Freq.A Freq.B Freq.C Freq.D
1 1 0 1 1 1
2 2 1 1 0 1
3 3 0 1 1 1
4 4 0 1 0 2
> names(t1) <- c('CLUSTER', levels(have$VAL)) #rename columns
CLUSTER A B C D
1 1 0 1 1 1
2 2 1 1 0 1
3 3 0 1 1 1
4 4 0 1 0 2
編輯:沒有dplyr
更簡潔的解決方案(感謝@thelatemail):
t1 <- table(have$CLUSTER, have$VAL)
cbind(CLUSTER = rownames(t1), as.data.frame.matrix(t1))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.