代码之家  ›  专栏  ›  技术社区  ›  Alex Holcombe

汇总数值列,返回非数值的最后一个值

  •  2
  • Alex Holcombe  · 技术社区  · 7 年前

    在对非数值列执行其他操作时,希望对数据帧或tibble的数值列进行汇总的情况并不少见。

    有个很好的办法 here ,但对于字符列似乎失败了。

    首先,它在这里工作,返回数值列的平均值和其他列的第一行的值

    set.seed(1234)
    category <- (c('A','A','E','E','B','B','C'))
    date <- seq(as.Date("2017-01-01"), by = "month", length.out = 7)
    value1 <- sample(seq(from = 91, to = 97, by = 1))
    dt <- data.frame(category, date, value1)
    dt<- as_tibble(dt)
    #works
    dt2<- dt %>%
      group_by(category) %>%
      summarise_all(funs(if_else(is.numeric(.), mean(.), last(.))))
    print(dt2)
    

    # A tibble: 4 x 3
      category date       value1
      <fct>    <date>      <dbl>
    1 A        2017-02-01   92.5
    2 B        2017-06-01   93.5
    3 C        2017-07-01   97  
    4 E        2017-04-01   94.5
    

    但是,当其中一个列是chr时失败

    marsupial <-c("quoll","phascogale",'triok','opossum','antechinus','bandicoot','Fat-tailed dunnart')
    dt$marsupial <- marsupial
    dt3<- dt %>% #doesn't work
      group_by(category) %>%
      summarise_all(funs(if_else(is.numeric(.), mean(.), last(.))))
    print(dt3)
    

    给出这些错误:

    Error in summarise_impl(.data, dots) : 
      Evaluation error: `false` must be type double, not character.
    In addition: Warning message:
    In mean.default(marsupial) :
      argument is not numeric or logical: returning NA
    

    'false' must be type double 指试图评估的有袋柱 last

    1 回复  |  直到 7 年前
        1
  •  2
  •   user10263052    7 年前

    如果是其他问题,那么我已经创建了一个函数。我已经更新了我的答案。我已经在dates属性上测试了它,它似乎也在列表中起作用。我希望它能解决你的问题:

    dt %>% group_by(category) %>%
      summarise_all(function(x){
      if(is.numeric(x)){
        return(mean(x))
      }else{
        nth(x,-1)
      }
    }
    )
    
    推荐文章