簡體   English   中英

r 中帶有 dplyr 的頻率表

[英]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使用tablextabscount ,但它要么丟失數據框類,要么將數據轉換為 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM