【问题标题】:Count numeric values in R data frame, grouped by another field计算 R 数据框中的数值,按另一个字段分组
【发布时间】:2013-12-10 03:12:10
【问题描述】:

我想计算 R 数据框中每个由另一个字段分组的特定字段的有效条目(数值)的数量,在本例中为“公司”。

Company <- rep(c('A','B','C'),3)
Dates <- c(rep('20130131',3),rep('20130228',3),rep('20130331',3))
F1 <- c(1:3,NA,NA,6:9)
F2 <- c(21:27,NA,NA)
F3 <- c(31:39)
F4 <- c(NA,NA,NA,44:48,NA)
df <- data.frame(Company, Dates, F1, F2, F3, F4)

生成的data.frame

> df

  Company    Dates F1 F2 F3 F4
1       A 20130131  1 21 31 NA
2       B 20130131  2 22 32 NA
3       C 20130131  3 23 33 NA
4       A 20130228 NA 24 34 44
5       B 20130228 NA 25 35 45
6       C 20130228  6 26 36 46
7       A 20130331  7 27 37 47
8       B 20130331  8 NA 38 48
9       C 20130331  9 NA 39 NA

然后我想知道每个“公司”和每个字段有多少日期具有有效(数字)值。 输出看起来像

Company F1 F2 F3 F4
      A  2  3  3  2
      B  2  2  3  2
      C  3  2  3  1

我正在处理的数据框将包含大约 500 家公司、365 个日期和 45 个字段,因此手动操作并不是一个真正的选择。

任何想法将不胜感激。

谢谢,

【问题讨论】:

    标签: r count dataframe summary


    【解决方案1】:

    基本解决方案和替代data.table 解决方案:

    aggregate(cbind(F1,F2,F3,F4) ~ Company, data=df, function(x) sum(!is.na(x)), na.action=na.pass)
      Company F1 F2 F3 F4
    1       A  2  3  3  2
    2       B  2  2  3  2
    3       C  3  2  3  1
    

    data.table:

    dt <- as.data.table(df)
    dt[,lapply(.SD,function(x) sum(!is.na(x))),by=Company,.SDcols=c("F1","F2","F3","F4")]
    
       Company F1 F2 F3 F4
    1:       A  2  3  3  2
    2:       B  2  2  3  2
    3:       C  3  2  3  1
    

    【讨论】:

    • +1。并且考虑到 OP 有很多列,.SDcols 可以定义为setdiff(colnames(dt),"Company")
    • @Codoremifa - 在这种情况下,实际上可能是:setdiff(colnames(dt),c("Company","Dates")) 甚至paste0("F",1:4)
    【解决方案2】:

    因为这是一个关于制表的问题,所以这里有一个选项,tablestack 后面加上“F”列。

    x <- cbind(Company = df$Company, 
               stack(df[setdiff(names(df), c("Company", "Dates"))]))
    table(x[complete.cases(x), c(1, 3)])
    #        ind
    # Company F1 F2 F3 F4
    #       A  2  3  3  2
    #       B  2  2  3  2
    #       C  3  2  3  1
    
    ## OR
    ## table(x[complete.cases(x), c("Company", "ind")])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-29
      • 2022-01-11
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      相关资源
      最近更新 更多