Метод печати, который показывает группы - PullRequest
0 голосов
/ 15 марта 2019

Используя dplyr, можно легко увидеть группы, по которым группируется набор данных.Как можно получить эти группы, используя data.table или определить метод печати, который их показывает.Пример:

df <- read.table(text = "X  Y Goal
32 12 1
                 13 42 0
                 55 33 0", header = TRUE)
setDT(df)
df[,lapply(.SD,sum),.(X,Y)][]

Вывод:

  X  Y Goal
1: 32 12    1
2: 13 42    0
3: 55 33    0

Выполнение чего-то похожего в dplyr обеспечивает более наглядное отображение групп, как я могу увидеть то же самое в data.table?

ОБНОВЛЕНИЕ : Действительно, как указывает @Gregor ниже, семейство summaris(z)e из dyplr автоматически разгруппируется.Тем не менее, как я могу заставить data.table напечатать что-то подобное, как показано ниже.

Пример вывода dplyr.data.table альтернатива утверждению # Groups: Species [3] - это именно то, что я ищу.

 library(dplyr)
  iris %>% 
    group_by(Species) 

    # A tibble: 150 x 5
    # Groups:   Species [3]
   #    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
   #           <dbl>       <dbl>        <dbl>       <dbl> <fct>  
   #  1          5.1         3.5          1.4         0.2 setosa 
   #  2          4.9         3            1.4         0.2 setosa 
   #  3          4.7         3.2          1.3         0.2 setosa 
   #  4          4.6         3.1          1.5         0.2 setosa 

Спасибо!

Ответы [ 2 ]

2 голосов
/ 22 марта 2019

На самом деле, рассмотрим базовые R by (объектно-ориентированная оболочка для tapply), используя identity, если цель - это чтение заголовка и конкретные потребности OP ниже:

Метод печати, который показываетгруппы... можно легко увидеть группы, по которым группируется набор данных

На самом деле, вы можете запустить любую операцию, например, summary и by выходы по-прежнему имеют групповые заголовки с разрывами разделов!

# ONE GROUP
by(df, random_df$group, identity)

# TWO GROUPS
with(df, by(random_df, list(group1, group2), identity))

# THREE GROUPS
with(df, by(random_df, list(group1, group2, group3), identity))

Ниже приведена демонстрация со случайными, посеянными данными:

Случайные данные

set.seed(3222018)
data_tools <- c("sas", "stata", "spss", "python", "r", "julia")

random_df <- data.frame(
  group = sample(data_tools, 50, replace=TRUE),
  int = sample(1:5, 50, replace=TRUE),
  num = rnorm(50),
  char = rep(letters[1:3], 20)[1:50],
  bool = sample(c(TRUE, FALSE), 50, replace=TRUE),
  data = as.Date(sample(1:as.integer(Sys.Date()), 50, replace=TRUE), origin="1970-01-01")  
)

Rextester demo

Одна группа

by(random_df, random_df$group, identity)

# random_df$group: julia
#    group int         num char  bool       data
# 9  julia   1  0.55209060    c  TRUE 2003-01-08
# 12 julia   5  0.25581573    c FALSE 1973-01-20
# 20 julia   2 -0.44872825    b FALSE 1981-12-20
# 30 julia   1  0.09790121    c  TRUE 1981-07-11
# 31 julia   1  1.75711081    a FALSE 1984-05-23
# 35 julia   3 -1.78797757    b  TRUE 1992-10-23
# 39 julia   5 -1.83548253    c  TRUE 1982-04-18
# 44 julia   3  0.52640304    b FALSE 2016-07-28
# 50 julia   2  0.05759068    b FALSE 1987-07-09
# ------------------------------------------------------------ 
#   random_df$group: python
#     group int         num char  bool       data
# 8  python   3 -0.75471461    b  TRUE 2018-04-08
# 15 python   4  0.03756282    c FALSE 2006-03-29
# 19 python   1  0.43025626    a FALSE 2005-03-30
# 22 python   4 -0.28019319    a FALSE 1997-02-19
# 24 python   2 -0.05318753    c FALSE 1977-08-02
# 45 python   2 -0.11575270    c  TRUE 2006-06-23
# 48 python   2 -0.29651827    c  TRUE 2015-07-13
# 49 python   3 -0.45816745    a FALSE 1991-09-09
# ------------------------------------------------------------ 
#   random_df$group: r
#    group int        num char  bool       data
# 5      r   4 -0.1748250    b FALSE 2005-04-20
# 14     r   2 -0.5868782    b  TRUE 2005-12-30
# 25     r   5 -0.5108906    a  TRUE 1985-08-26
# 33     r   1  0.3580581    c FALSE 1983-08-16
# 34     r   3 -2.9556022    a  TRUE 1998-07-24
# 36     r   5 -2.5008645    c  TRUE 1990-12-30
# 43     r   5 -2.1710319    a  TRUE 1987-09-29
# ------------------------------------------------------------ 
#   ...

Две группы

with(random_df, by(random_df, list(group, char), identity))

# : julia
# : a
#    group int      num char  bool       data
# 31 julia   1 1.757111    a FALSE 1984-05-23
# ------------------------------------------------------------ 
# : python
# : a
#     group int        num char  bool       data
# 19 python   1  0.4302563    a FALSE 2005-03-30
# 22 python   4 -0.2801932    a FALSE 1997-02-19
# 49 python   3 -0.4581675    a FALSE 1991-09-09
# ------------------------------------------------------------ 
# : r
# : a
#    group int        num char bool       data
# 25     r   5 -0.5108906    a TRUE 1985-08-26
# 34     r   3 -2.9556022    a TRUE 1998-07-24
# 43     r   5 -2.1710319    a TRUE 1987-09-29
# ------------------------------------------------------------ 
# : sas
# : a
#    group int        num char  bool       data
# 28   sas   2 -0.6086176    a FALSE 2019-01-26
# 40   sas   4  0.5408948    a FALSE 2004-10-24
# 46   sas   1  0.7266734    a  TRUE 1996-09-05
# ------------------------------------------------------------ 
# : spss
# : a
#    group int         num char  bool       data
# 1   spss   1 -0.06494476    a  TRUE 1999-07-10
# 7   spss   5  1.93460991    a  TRUE 1974-04-17
# 16  spss   1 -0.55380012    a FALSE 2010-04-06
# 37  spss   1  0.17309091    a  TRUE 1999-01-22
# ------------------------------------------------------------ 
# : stata
# : a
#    group int        num char bool       data
# 4  stata   1 -1.0498222    a TRUE 1981-05-01
# 10 stata   1  1.9223104    a TRUE 1996-07-23
# 13 stata   1 -0.8381546    a TRUE 1989-01-12
# ------------------------------------------------------------ 
# ...

Три группы

with(random_df, by(random_df, list(group, char, int), identity))

# : julia
# : a
# : 1
#    group int      num char  bool       data
# 31 julia   1 1.757111    a FALSE 1984-05-23
# ------------------------------------------------------------ 
# : python
# : a
# : 1
#     group int       num char  bool       data
# 19 python   1 0.4302563    a FALSE 2005-03-30
# ------------------------------------------------------------ 
# : r
# : a
# : 1
# NULL
# ------------------------------------------------------------ 
# : sas
# : a
# : 1
#    group int       num char bool       data
# 46   sas   1 0.7266734    a TRUE 1996-09-05
# ------------------------------------------------------------ 
# : spss
# : a
# : 1
#    group int         num char  bool       data
# 1   spss   1 -0.06494476    a  TRUE 1999-07-10
# 16  spss   1 -0.55380012    a FALSE 2010-04-06
# 37  spss   1  0.17309091    a  TRUE 1999-01-22
# ------------------------------------------------------------ 
# : stata
# : a
# : 1
#    group int        num char bool       data
# 4  stata   1 -1.0498222    a TRUE 1981-05-01
# 10 stata   1  1.9223104    a TRUE 1996-07-23
# 13 stata   1 -0.8381546    a TRUE 1989-01-12
# ------------------------------------------------------------ 
# ...

data.table пример

Для иллюстрации можно также запустить любую операцию внутри by, включая data.table агрегацию, чтобы по-прежнему возвращать сгруппированные заголовки и разрывы разделов при выводе на печать:

library(data.table)
...

by(random_df, random_df$group, function(sub)

  data.table(sub)[, list(mean_num = mean(num),
                         median_num = median(num),
                         min_num = min(num),
                         max_num = max(num),
                         total_num = sum(num)), by = char]
)

# random_df$group: julia
#    char   mean_num median_num   min_num   max_num total_num
# 1:    c -0.2324187  0.1768585 -1.835483 0.5520906 -0.929675
# 2:    b -0.4131780 -0.1955688 -1.787978 0.5264030 -1.652712
# 3:    a  1.7571108  1.7571108  1.757111 1.7571108  1.757111
# ------------------------------------------------------------------------------ 
#   random_df$group: python
#    char   mean_num  median_num    min_num     max_num  total_num
# 1:    b -0.7547146 -0.75471461 -0.7547146 -0.75471461 -0.7547146
# 2:    c -0.1069739 -0.08447011 -0.2965183  0.03756282 -0.4278957
# 3:    a -0.1027015 -0.28019319 -0.4581675  0.43025626 -0.3081044
# ------------------------------------------------------------------------------ 
#   random_df$group: r
#    char   mean_num median_num    min_num    max_num  total_num
# 1:    b -0.3808516 -0.3808516 -0.5868782 -0.1748250 -0.7617031
# 2:    a -1.8791749 -2.1710319 -2.9556022 -0.5108906 -5.6375247
# 3:    c -1.0714032 -1.0714032 -2.5008645  0.3580581 -2.1428064
# ------------------------------------------------------------------------------ 
#   random_df$group: sas
#    char    mean_num  median_num    min_num   max_num  total_num
# 1:    c  0.08215953 0.163064560 -1.3670420 1.3695510  0.3286381
# 2:    b -0.16423225 0.005903355 -1.3995380 0.7308023 -0.6569290
# 3:    a  0.21965022 0.540894826 -0.6086176 0.7266734  0.6589507
# ------------------------------------------------------------------------------ 
#   random_df$group: spss
#    char   mean_num  median_num    min_num    max_num total_num
# 1:    a  0.3722390  0.05407307 -0.5538001  1.9346099  1.488956
# 2:    b  0.5085635  0.73430008 -0.3003130  0.8659667  2.034254
# 3:    c -1.2909541 -1.29095413 -1.2909541 -1.2909541 -1.290954
# ------------------------------------------------------------------------------ 
#   random_df$group: stata
#    char    mean_num median_num    min_num    max_num  total_num
# 1:    a  0.01144453 -0.8381546 -1.0498222  1.9223104  0.0343336
# 2:    b -0.65927260 -0.6592726 -1.1870952 -0.1314500 -1.3185452
# 3:    c  0.94910811  0.9491081  0.9491081  0.9491081  0.9491081
1 голос
/ 21 марта 2019

# Groups: Species [3] не печатается dplyr.Используется метод печати tibble.

. Вы можете проверить / имитировать это:


> a = iris
> # Set "Groups"
> setattr(a, "vars", "this_is_a_test_group") 
> # lie that it is a grouped_df
> setattr(a, "class", c("grouped_df","tbl_df", "tbl", "data.frame")) 
> 
> a
# A tibble: 150 x 5
# Groups:   this_is_a_test_group [?]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ... with 140 more rows

Количество групп Species [3] ([3]) контролируется атрибутом indices.

Это вложенный список индексов строк для каждой группы.

> setattr(a, "indices", list(1:5, 5:10, 10:15))
> a
# A tibble: 150 x 5
# Groups:   this_is_a_test_group [3]
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
          <dbl>       <dbl>        <dbl>       <dbl> <fct>  
 1          5.1         3.5          1.4         0.2 setosa 
 2          4.9         3            1.4         0.2 setosa 
 3          4.7         3.2          1.3         0.2 setosa 
 4          4.6         3.1          1.5         0.2 setosa 
 5          5           3.6          1.4         0.2 setosa 
 6          5.4         3.9          1.7         0.4 setosa 
 7          4.6         3.4          1.4         0.3 setosa 
 8          5           3.4          1.5         0.2 setosa 
 9          4.4         2.9          1.4         0.2 setosa 
10          4.9         3.1          1.5         0.1 setosa 
# ... with 140 more rows

Это на самом деле не дает конкретного ответа на ваш вопрос.Но продемонстрировать это в комментариях будет сложнее.

Чтобы получить такой вывод (с groups[n] перед фактическим data.table), вам придется написать новый метод печати, который является оберткой поверх данных..table print, но печатает эти атрибуты "vars" перед вызовом data.table print.И создайте новый класс, например «custom.groupped.data.table», который будет использовать этот метод печати. ​​

Или присоедините эти атрибуты и превратите его в объект tibble.

EDIT:

ну, очевидно, некоторые из этих функций уже реализованы в методе печати data.table (но не включены по умолчанию).

, в частности: print.keys = TRUE

> b = data.table(iris)
> setkey(b, "Species")
> print(b, print.keys = TRUE)
Key: <Species>
     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
146:          6.7         3.0          5.2         2.3 virginica
147:          6.3         2.5          5.0         1.9 virginica
148:          6.5         3.0          5.2         2.0 virginica
149:          6.2         3.4          5.4         2.3 virginica
150:          5.9         3.0          5.1         1.8 virginica
> print(b, print.keys = TRUE, class = TRUE)
Key: <Species>
     Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
            <num>       <num>        <num>       <num>    <fctr>
  1:          5.1         3.5          1.4         0.2    setosa
  2:          4.9         3.0          1.4         0.2    setosa
  3:          4.7         3.2          1.3         0.2    setosa
  4:          4.6         3.1          1.5         0.2    setosa
  5:          5.0         3.6          1.4         0.2    setosa
 ---                                                            
146:          6.7         3.0          5.2         2.3 virginica
147:          6.3         2.5          5.0         1.9 virginica
148:          6.5         3.0          5.2         2.0 virginica
149:          6.2         3.4          5.4         2.3 virginica
150:          5.9         3.0          5.1         1.8 virginica

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...