【问题标题】:Count observations of distinct values per group and add a new column of counts for each value [duplicate]计算每组不同值的观察值,并为每个值添加一个新的计数列[重复]
【发布时间】:2017-03-28 14:21:51
【问题描述】:

类似于这个问题Count number of observations/rows per group and add result to data frame,但不完全是。

我想改造一下

   group id_in_group letter
1:     A          A1   alef
2:     A          A2    bet
3:     A          A3    bet
4:     B          B1   alef
5:     B          B2   alef
6:     B          B3  gimel

进入这个

   group aleph bet gimel
1:     A     1   2     0
2:     B     2   0     1

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    或者没有任何额外的库,你可以使用 table:

    table(df$group,df$letter)
    

    由于您似乎使用 data.table,您也可以使用dcast()

    dcast(df, group~letter,length)
    

    【讨论】:

    • 感谢您提供 data.table 解决方案!
    【解决方案2】:

    我将使用 dplyrtidyr 执行的典型任务。

    library(dplyr)
    library(tidyr)
    df <- data.frame(group = c("A", "A", "A", "B", "B", "B"),
                 id_in_group = c("A1", "A2", "A3", "B1", "B2", "B3"),
                 letter = c("alef", "bet", "bet", "alef", "alef", "gimel"))
    
    df %>% 
      group_by(group, letter) %>% 
      summarise(n = n()) %>% 
      spread(letter, n, fill = 0)
    

    【讨论】:

    • 或者你可以这样做:... %&gt;% group_by(group) %&gt;% count(letter) %&gt;% ...
    • @ThomasK 显然不需要 group_by:DF %&gt;% count(group, letter) %&gt;% spread(letter, n, fill = 0)
    【解决方案3】:

    带data.table

    library(data.table)
    
    dt <- data.table(group=c(rep('A',3),rep('B',3)),
               id_in_group=c(paste0('A',seq(1,3,1)),paste0('B',seq(1,3,1))),
               letter=c('alef','bet','bet','alef','alef','gimel'))
    
    dt[,aleph:=ifelse(like(letter,"a"),1,0)][
      ,bet:=ifelse(like(letter,"bet"),1,0)][
      ,gimal:=ifelse(like(letter,"gimel"),1,0)]
    dt[,':='(id_in_group=NULL,letter=NULL)][,lapply(.SD,sum),by=group]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 1970-01-01
      • 2023-01-27
      • 2017-11-02
      相关资源
      最近更新 更多