Как получить фрейм данных из списка звездочетов

#r #list #stargazer

#r #Список #звездочет

Вопрос:

Я хотел бы получить фрейм данных для каждого элемента списка из объекта списка. Ниже приведен пример

 mtcars_sumstat <- mtcars %>% 
select(mpg:qsec,am) %>% 
as.data.frame() %>% 
split(.$am) %>% 
 walk(~stargazer(.,type = "text",
             summary.stat = c ("n", "mean", "sd")))

mtcars_sumstat

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       19 17.147   3.834  
cyl       19  6.947   1.545  
disp      19 290.379 110.172 
hp        19 160.263  53.908 
drat      19  3.286   0.392  
wt        19  3.769   0.777  
qsec      19 18.183   1.751  
am        19  0.000   0.000  
-----------------------------

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
-----------------------------
 

Когда я запускаю следующий код, я получаю два фрейма данных для 2 элементов списка; Но эти фреймы данных содержат фактические данные, а не приведенную выше сводную статистику.

 list2env(mtcars_sumstat,.GlobalEnv)
 

По сути, я хочу, чтобы приведенная выше сводная статистика содержалась в двух отдельных фреймах данных в качестве ОБЪЕКТА фрейма данных в «ГЛОБАЛЬНОЙ СРЕДЕ». Могу ли я как-нибудь это сделать? Фрейм данных должен выглядеть следующим образом как ОБЪЕКТ фрейма данных —

 
Statistic N   Mean   St. Dev.
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
 

Ответ №1:

Обновление для комментариев OP

Может быть проще просто использовать стандартные dplyr манипуляции для получения сводной статистики. Используйте pivot_longer , group_by , и summarise :

 mtcars %>% 
  select(mpg:qsec, am) %>% 
  pivot_longer(-am) %>%
  group_by(am, name) %>%
  summarise(across(value, .fns=list(mean = mean, sd = sd, n = length), .names = "{fn}")) %>%
  group_split()
 

Вывод:

 $`0`
# A tibble: 7 x 5
# Groups:   am [1]
     am name    mean      sd     n
  <dbl> <chr>  <dbl>   <dbl> <int>
1     0 cyl     6.95   1.54     19
2     0 disp  290.   110.       19
3     0 drat    3.29   0.392    19
4     0 hp    160.    53.9      19
5     0 mpg    17.1    3.83     19
6     0 qsec   18.2    1.75     19
7     0 wt      3.77   0.777    19


 #r #list #stargazer

 #r #Список #звездочет

Вопрос:

Я хотел бы получить фрейм данных для каждого элемента списка из объекта списка. Ниже приведен пример
 mtcars_sumstat <- mtcars %>% 
select(mpg:qsec,am) %>% 
as.data.frame() %>% 
split(.$am) %>% 
 walk(~stargazer(.,type = "text",
             summary.stat = c ("n", "mean", "sd")))

mtcars_sumstat

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       19 17.147   3.834  
cyl       19  6.947   1.545  
disp      19 290.379 110.172 
hp        19 160.263  53.908 
drat      19  3.286   0.392  
wt        19  3.769   0.777  
qsec      19 18.183   1.751  
am        19  0.000   0.000  
-----------------------------

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
-----------------------------
 

Когда я запускаю следующий код, я получаю два фрейма данных для 2 элементов списка; Но эти фреймы данных содержат фактические данные, а не приведенную выше сводную статистику.

 list2env(mtcars_sumstat,.GlobalEnv)
 

По сути, я хочу, чтобы приведенная выше сводная статистика содержалась в двух отдельных фреймах данных в качестве ОБЪЕКТА фрейма данных в "ГЛОБАЛЬНОЙ СРЕДЕ". Могу ли я как-нибудь это сделать? Фрейм данных должен выглядеть следующим образом как ОБЪЕКТ фрейма данных -

 
Statistic N   Mean   St. Dev.
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
 

Ответ №1:

Обновление для комментариев OP

Может быть проще просто использовать стандартные dplyr манипуляции для получения сводной статистики. Используйте pivot_longer , group_by , и summarise :

 mtcars %>% 
  select(mpg:qsec, am) %>% 
  pivot_longer(-am) %>%
  group_by(am, name) %>%
  summarise(across(value, .fns=list(mean = mean, sd = sd, n = length), .names = "{fn}")) %>%
  group_split()
 

Вывод:

1`
# A tibble: 7 x 5
# Groups: am [1]
am name mean sd n
<dbl> <chr> <dbl> <dbl> <int>
1 1 cyl 5.08 1.55 13
2 1 disp 144. 87.2 13
3 1 drat 4.05 0.364 13
4 1 hp 127. 84.1 13
5 1 mpg 24.4 6.17 13
6 1 qsec 17.4 1.79 13
7 1 wt 2.41 0.617 13

Предыдущий ответ

Измените walk на map и добавьте map(tibble) :

 mtcars_sumstat <- mtcars %>% 
  select(mpg:qsec,am) %>% 
  as.data.frame() %>% 
  split(.$am) %>% 
  map_df(~stargazer(.,type = "text", summary.stat = c ("n", "mean", "sd"))) %>%
  map(tibble)
 

Вывод:

 mtcars_sumstat
$`0`
# A tibble: 13 x 1
   `<chr>`                        
   <chr>                          
 1 ""                             
 2 "============================="
 3 "Statistic N   Mean   St. Dev."
 4 "-----------------------------"
 5 "mpg       19 17.147   3.834  "
 6 "cyl       19  6.947   1.545  "
 7 "disp      19 290.379 110.172 "
 8 "hp        19 160.263  53.908 "
 9 "drat      19  3.286   0.392  "
10 "wt        19  3.769   0.777  "
11 "qsec      19 18.183   1.751  "
12 "am        19  0.000   0.000  "
13 "-----------------------------"


 #r #list #stargazer

 #r #Список #звездочет

Вопрос:

Я хотел бы получить фрейм данных для каждого элемента списка из объекта списка. Ниже приведен пример
 mtcars_sumstat <- mtcars %>% 
select(mpg:qsec,am) %>% 
as.data.frame() %>% 
split(.$am) %>% 
 walk(~stargazer(.,type = "text",
             summary.stat = c ("n", "mean", "sd")))

mtcars_sumstat

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       19 17.147   3.834  
cyl       19  6.947   1.545  
disp      19 290.379 110.172 
hp        19 160.263  53.908 
drat      19  3.286   0.392  
wt        19  3.769   0.777  
qsec      19 18.183   1.751  
am        19  0.000   0.000  
-----------------------------

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
-----------------------------
 

Когда я запускаю следующий код, я получаю два фрейма данных для 2 элементов списка; Но эти фреймы данных содержат фактические данные, а не приведенную выше сводную статистику.

 list2env(mtcars_sumstat,.GlobalEnv)
 

По сути, я хочу, чтобы приведенная выше сводная статистика содержалась в двух отдельных фреймах данных в качестве ОБЪЕКТА фрейма данных в "ГЛОБАЛЬНОЙ СРЕДЕ". Могу ли я как-нибудь это сделать? Фрейм данных должен выглядеть следующим образом как ОБЪЕКТ фрейма данных -

 
Statistic N   Mean   St. Dev.
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
 

Ответ №1:

Обновление для комментариев OP

Может быть проще просто использовать стандартные dplyr манипуляции для получения сводной статистики. Используйте pivot_longer , group_by , и summarise :

 mtcars %>% 
  select(mpg:qsec, am) %>% 
  pivot_longer(-am) %>%
  group_by(am, name) %>%
  summarise(across(value, .fns=list(mean = mean, sd = sd, n = length), .names = "{fn}")) %>%
  group_split()
 

Вывод:

 $`0`
# A tibble: 7 x 5
# Groups:   am [1]
     am name    mean      sd     n
  <dbl> <chr>  <dbl>   <dbl> <int>
1     0 cyl     6.95   1.54     19
2     0 disp  290.   110.       19
3     0 drat    3.29   0.392    19
4     0 hp    160.    53.9      19
5     0 mpg    17.1    3.83     19
6     0 qsec   18.2    1.75     19
7     0 wt      3.77   0.777    19


 #r #list #stargazer

 #r #Список #звездочет

Вопрос:

Я хотел бы получить фрейм данных для каждого элемента списка из объекта списка. Ниже приведен пример
 mtcars_sumstat <- mtcars %>% 
select(mpg:qsec,am) %>% 
as.data.frame() %>% 
split(.$am) %>% 
 walk(~stargazer(.,type = "text",
             summary.stat = c ("n", "mean", "sd")))

mtcars_sumstat

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       19 17.147   3.834  
cyl       19  6.947   1.545  
disp      19 290.379 110.172 
hp        19 160.263  53.908 
drat      19  3.286   0.392  
wt        19  3.769   0.777  
qsec      19 18.183   1.751  
am        19  0.000   0.000  
-----------------------------

=============================
Statistic N   Mean   St. Dev.
-----------------------------
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
-----------------------------
 

Когда я запускаю следующий код, я получаю два фрейма данных для 2 элементов списка; Но эти фреймы данных содержат фактические данные, а не приведенную выше сводную статистику.

 list2env(mtcars_sumstat,.GlobalEnv)
 

По сути, я хочу, чтобы приведенная выше сводная статистика содержалась в двух отдельных фреймах данных в качестве ОБЪЕКТА фрейма данных в "ГЛОБАЛЬНОЙ СРЕДЕ". Могу ли я как-нибудь это сделать? Фрейм данных должен выглядеть следующим образом как ОБЪЕКТ фрейма данных -

 
Statistic N   Mean   St. Dev.
mpg       13 24.392   6.167  
cyl       13  5.077   1.553  
disp      13 143.531  87.204 
hp        13 126.846  84.062 
drat      13  4.050   0.364  
wt        13  2.411   0.617  
qsec      13 17.360   1.792  
am        13  1.000   0.000  
 

Ответ №1:

Обновление для комментариев OP

Может быть проще просто использовать стандартные dplyr манипуляции для получения сводной статистики. Используйте pivot_longer , group_by , и summarise :

 mtcars %>% 
  select(mpg:qsec, am) %>% 
  pivot_longer(-am) %>%
  group_by(am, name) %>%
  summarise(across(value, .fns=list(mean = mean, sd = sd, n = length), .names = "{fn}")) %>%
  group_split()
 

Вывод:

1`
# A tibble: 7 x 5
# Groups: am [1]
am name mean sd n
<dbl> <chr> <dbl> <dbl> <int>
1 1 cyl 5.08 1.55 13
2 1 disp 144. 87.2 13
3 1 drat 4.05 0.364 13
4 1 hp 127. 84.1 13
5 1 mpg 24.4 6.17 13
6 1 qsec 17.4 1.79 13
7 1 wt 2.41 0.617 13

Предыдущий ответ

Измените walk на map и добавьте map(tibble) :

 mtcars_sumstat <- mtcars %>% 
  select(mpg:qsec,am) %>% 
  as.data.frame() %>% 
  split(.$am) %>% 
  map_df(~stargazer(.,type = "text", summary.stat = c ("n", "mean", "sd"))) %>%
  map(tibble)
 

Вывод:

1`
# A tibble: 13 x 1
`<chr>`
<chr>
1 ""
2 "============================="
3 "Statistic N Mean St. Dev."
4 "-----------------------------"
5 "mpg 13 24.392 6.167 "
6 "cyl 13 5.077 1.553 "
7 "disp 13 143.531 87.204 "
8 "hp 13 126.846 84.062 "
9 "drat 13 4.050 0.364 "
10 "wt 13 2.411 0.617 "
11 "qsec 13 17.360 1.792 "
12 "am 13 1.000 0.000 "
13 "-----------------------------"

Комментарии:

1. Спасибо. У вас есть идея, как можно очистить знаки «» и создать красивый фрейм данных.

2. Можете ли вы отредактировать свой пост, чтобы обеспечить ожидаемый результат? Я не уверен, что означает «хороший фрейм данных».

3. Если вам действительно нужна сводная статистика в отдельных числовых столбцах, было бы намного проще сгенерировать их с помощью обычных dplyr методов. Stargazer действительно предназначен для форматирования выходных данных, а не для манипулирования данными.

4. На самом деле я пытаюсь работать с rmarkdown (latex) pdf для своих результатов исследования, но не знаю, как dplyr мне это может помочь. для этой цели.

5. Хорошо, смотрите Обновленный ответ для гораздо более быстрого решения, которое не зависит от stargazer .