首页 文章

R中两列的频率计数

提问于
浏览
21

我在数据框中有两列

2010  1
2010  1
2010  2
2010  2
2010  3
2011  1
2011  2

我想计算两列的频率,并以此格式得到结果

y    m Freq
 2010  1 2
 2010  2 2
 2010  3 1
 2011  1 1
 2011  2 1

6 回答

  • 4

    @ ugh的答案更为惯用的data.table版本是:

    library(data.table) # load package
    df <- data.frame(y = c(rep(2010, 5), rep(2011,2)), m = c(1,1,2,2,3,1,2)) # setup data
    dt <- data.table(df) # transpose to data.table
    dt[, list(Freq =.N), by=list(y,m)] # use list to name var directly
    
  • 27

    如果您有一个包含许多列的非常大的数据框或者事先不知道列名,那么这样的事情可能会有用:

    library(reshape2)
    df_counts <- melt(table(df))
    names(df_counts) <- names(df)
    colnames(df_counts)[ncol(df_counts)] <- "count"
    df_counts    
    
      y    m     count
    1 2010 1     2
    2 2011 1     1
    3 2010 2     2
    4 2011 2     1
    5 2010 3     1
    6 2011 3     0
    
  • 3

    我还没有看到dplyr的回答 . 代码很简单 .

    library(dplyr)
    rename(count(df, y, m), Freq = n)
    # Source: local data frame [5 x 3]
    # Groups: V1 [?]
    #
    #       y     m  Freq
    #   (int) (int) (int)
    # 1  2010     1     2
    # 2  2010     2     2
    # 3  2010     3     1
    # 4  2011     1     1
    # 5  2011     2     1
    

    Data:

    df <- structure(list(y = c(2010L, 2010L, 2010L, 2010L, 2010L, 2011L, 
    2011L), m = c(1L, 1L, 2L, 2L, 3L, 1L, 2L)), .Names = c("y", "m"
    ), class = "data.frame", row.names = c(NA, -7L))
    
  • 7
    library(data.table)
    
    oldformat <- data.table(oldformat)  ## your orignal data frame
    newformat <- oldformat[,list(Freq=length(m)), by=list(y,m)]
    
  • 10

    使用 sqldf

    sqldf("SELECT y, m, COUNT(*) as Freq
           FROM table1
           GROUP BY y, m")
    
  • 4

    如果您的数据是数据框 df ,其列为 ym

    library(plyr)
    counts <- ddply(df, .(df$y, df$m), nrow)
    names(counts) <- c("y", "m", "Freq")
    

相关问题