代码之家  ›  专栏  ›  技术社区  ›  Nick Criswell

r data.table按创建列分组

  •  0
  • Nick Criswell  · 技术社区  · 7 年前

    我是新来的 data.table 包装和我遇到的问题,希望有一个简单的解决方案。我想过滤 数据.表 ,添加一些列 数据.表 并按其中的一些列分组 数据.表 包括我创建的列之一 在我的 j 条款。

    如果我使用 dplyr ,应该是这样的:

    library(dplyr)
    
    mtcars %>% 
        filter(vs == 1) %>% 
        mutate(trans = ifelse(am == 1, "Manual", "Auto")) %>% 
        group_by(gear, carb, trans) %>% 
        summarise(num_cars = n(),
                  avg_qsec = mean(qsec))
    
    # A tibble: 6 x 5
    # Groups:   gear, carb [?]
       gear  carb trans  num_cars avg_qsec
      <dbl> <dbl> <chr>     <int>    <dbl>
    1     3     1 Auto          3     19.9
    2     4     1 Manual        4     19.2
    3     4     2 Auto          2     21.4
    4     4     2 Manual        2     18.6
    5     4     4 Auto          2     18.6
    6     5     2 Manual        1     16.9
    

    我的尝试 数据.表 不起作用。

    library(data.table)
    
    dtmt <- as.data.table(mtcars)
    
    dtmt[vs == 1, 
         .(num_cars = .N, 
           avg_qsec = mean(qsec), 
           trans = ifelse(am == 1, 
                          "Manual", "Auto")),
         by = list(gear, carb, trans)]
    
    
    Error in eval(bysub, xss, parent.frame()) : object 'trans' not found
    

    所以我在我的专栏里 J 子句不能用于 by ?如果我不尝试改变 am 列。

    dtmt[vs == 1, 
         .(num_cars = .N, 
           avg_qsec = mean(qsec)),
         by = list(gear, carb, am)]
    
       gear carb am num_cars avg_qsec
    1:    4    1  1        4    19.22
    2:    3    1  0        3    19.89
    3:    4    2  0        2    21.45
    4:    4    4  0        2    18.60
    5:    4    2  1        2    18.56
    6:    5    2  1        1    16.90
    

    谢谢!

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

    []

    as.data.table(mtcars)[
        vs == 1,
        .(num_cars = .N, avg_qsec = mean(qsec)),
        by = .(gear, carb, trans = ifelse(am == 1, "Manual", "Auto"))]
    
    #    gear carb  trans num_cars avg_qsec
    # 1:    4    1 Manual        4    19.22
    # 2:    3    1   Auto        3    19.89
    # 3:    4    2   Auto        2    21.45
    # 4:    4    4   Auto        2    18.60
    # 5:    4    2 Manual        2    18.56
    # 6:    5    2 Manual        1    16.90
    
        2
  •  1
  •   akrun    7 年前

    dtmt[vs==1 # subset the rows
        ][, trans := c("Auto", "Manual")[(am==1)+1] # create trans
         ][, .(num_cars = .N, avg_qsec = mean(qsec)), by = .(gear, carb, trans)]