Я пытаюсь напечатать сводную статистику по категориальной переменной и постоянно получаю следующее сообщение об ошибке:
Error in `map2()`:
ℹ In index: 1.
ℹ With name: Control.
Caused by error in `if (nchar(text.matrix[r, c]) > max.length[real.c]) ...`:
! missing value where TRUE/FALSE needed
Backtrace:
1. ... %>% ...
2. purrr::iwalk(...)
3. purrr::walk2(.x, vec_index(.x), .f, ...)
4. purrr::map2(.x, .y, .f, ..., .progress = .progress)
5. purrr:::map2_("list", .x, .y, .f, ..., .progress = .progress)
9. .f(.x[[i]], .y[[i]], ...)
10. stargazer::stargazer(...)
11. stargazer:::.stargazer.wrap(...)
12. stargazer (local) .text.output(latex.code)
13. stargazer (local) .text.column.width(t, c)
Это код, который я запускаю:
df %>%
split(. $treat) %>%
iwalk(~
stargazer(.,
type = "text",
flip = TRUE,
title = "Table X: Balance tests by treatment status",
covariate.labels = c(
"Female (0/1)",
"Year of birth",
"Phone number (0/1)",
"Registered Democrat (0/1)",
"Registered Republican (0/1)",
"Unaffiliated (0/1)"),
align = TRUE)
)
Я читал другие сообщения (например, этот и этот), которые предполагают, что проблема связана с подчеркиванием в метках ковариат, но, как вы можете видеть, у меня его нет.
Я попытался удалить (0/1) из меток, преобразовать переменную treat в числовую (в настоящее время это фактор) и попытаться изменить имена переменных, чтобы удалить подчеркивания. Я получаю одно и то же сообщение об ошибке в каждом случае.
Этот фрагмент данных можно использовать для воспроизведения ошибки:
df <- structure(list(treat = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L), levels = c("Control",
"Treatment 1", "Treatment 2", "Treatment 3"
), class = "factor"), female = structure(c(1L, 1L, 2L, 2L, 2L,
1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L), levels = c("female",
"male"), class = "factor"), birth_year = c(1945, 1930, 1990,
1984, 1992, 1957, 1996, 1977, 1975, 1985, 1936, 1992, 1958, 1939,
1986, 1955, 1962, 1973, 1986, 1950), provided_phone_no = c(1,
1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1), dem = c(1,
1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0), rep = c(0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1), uaf = c(0,
0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0)), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L), groups = structure(list(
treat = structure(1:4, levels = c("Control", "Treatment 1",
"Treatment 2", "Treatment 3"), class = "factor"),
.rows = structure(list(1:5, 6:10, 11:15, 16:20), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, -4L), .drop = TRUE, class = c("tbl_df",
"tbl", "data.frame")))





Modelsummary позволяет очень легко создавать такие столы. Он предупредит вас о том, что вам нужно включить в преамбулу, но кроме этого вам не нужно делать много дополнительных действий!
library(dplyr)
library(purrr)
library(modelsummary)
nice_data = df |>
select(`Female (0/1)` = female,
`Birth Year` = birth_year,
`Phone Number (0/1)` = provided_phone_no,
`Registered Dem (0/1)` = dem,
`Registered Rep (0/1)` = rep,
`Unaffiliated (0/1)` = uaf,
`Treatment` = treat)
## you can rename it in the table but
## I tend to prefer renaming before
examp = datasummary_balance(~Treatment,
data = nice_data,
## this turns off calculating the difference in means
dinm = FALSE,
output = 'balance_table.tex')
## If you want to iterate through
test_split = split(nice_data, nice_data$Treatment)
names_vec = names(test_split)
## this will save the tables
tables = map2(test_split, names_vec, \(x,y) datasummary_balance(~Treatment,
data = x,
## this turns off calculating the difference in means
dinm = FALSE,
output = paste0("balance_table_", y, ".tex")))
Обновлено: Предполагая, что вам нужен вывод LaTeX, вам нужно передать некоторый необработанный код LaTeX на ваши метки, подобные этому.
library(stargazr)
nice_data %>%
split(. $Treatment) %>%
iwalk(~
stargazer(.,
type = "latex",
flip = TRUE,
title = "Table X: Balance tests by treatment status",
covariate.labels.include = FALSE,
covariate.labels = c(
"Female $\frac{0}{1}$",
"Year of birth $\frac{0}{1}$",
"Phone number",
"Registered Democrat $\frac{0}{1}$ ",
"Registered Republican $\frac{0}{1}$",
"Unaffiliated $\frac{0}{1}$"),
align = TRUE
)
)
Где вы помещаете 0/1 в математическую среду. Однако я настоятельно рекомендую modelsummary из-за его простоты и гибкости при создании таблиц.
Created on 2024-06-10 with reprex v2.1.0
Я обновил репрекс примером звездочета.
Это восхитительно. Спасибо, Джош. Я воспользуюсь сводкой моделей, но мне просто было любопытно, что я делаю не так — я использовал точно тот же код, который разместил в ОП в предыдущем проекте, и он работал нормально.
Это честно! Честно говоря, мне непонятно, из-за чего он выходит из строя. Честно говоря, я бы обратился к сопровождающему пакета. Вероятно, происходит какое-то странное взаимодействие между R и LaTeX.
Это очень полезно, Джош, спасибо, что нашли время рассмотреть мою проблему и поделиться решением. Мне все равно хотелось бы знать, почему звездочет не работает, если у вас/у кого-то еще есть какие-нибудь мысли по этому поводу!