Мне это кажется очевидным на концептуальном уровне, но почему-то я не могу понять, как это сделать в R. У меня есть фрейм данных с двумя переменными, каждая из которых привязана к 9 уровням, например:
Чтобы быть более дружелюбным для возможных пользователей и читателей, я хочу, чтобы это выглядело немного более интерпретируемым, например:
Но каков правильный инструмент и / или подход для этого в R? Я пробовал ftable и xtable, но проблема в том, что нет дополнительных исходных «сырых» данных, в то время как ftable / xtable требуют именно таких данных, выложенных в виде таблицы непредвиденных обстоятельств для получения подсчетов, и означает et c. Самое близкое, что у меня получилось, - это попытка отформатировать таблицу вручную с помощью flextable.
Может быть, это слишком скромная задача для R? Следует ли мне использовать другой инструмент / язык?
Спасибо за любые указатели --J.
- EDIT_20200528_2141:
Как отмечает @LenGreski, tables::tabular()
обеспечивает это ( см .: https://cran.r-project.org/web/packages/tables/tables.pdf). Я просто хотел указать на конкретное c отличие от того, что объясняется в решении , указанном выше . Это решение предполагает, что у вас есть числа, которые можно подсчитать и усреднить, в моем случае у меня просто это:
genre origin mean stdv
1 Western PL 0.3213601 0.19510242
2 Western IT 0.2502920 0.26645386
3 Western US 0.4688884 0.06305476
4 Thriller PL 0.3117736 0.17128256
5 Thriller IT 0.1970238 0.27456382
6 Thriller US 0.4371585 0.10925573
7 Romantic PL 0.3334293 0.20280193
8 Romantic IT 0.2502829 0.31400158
9 Romantic US 0.4629377 0.02612357
Итак, нет базовых данных, только средства и sds, вот и все . Это может поставить вас в затруднительное положение, поскольку tabular()
действительно хочет подсчитывать и усреднять частоты самостоятельно. Таким образом, стандартное решение побуждает вас сделать следующее:
tabular( Factor(genre) ~ Factor(origin) * ( mean + stdv ), data=movies )
Сначала это выглядит загадочно c, но как только вы получите обозначение, это действительно имеет смысл. Внимательно изучите документацию (стр. 26-29). Это работает:
origin
IT PL US
genre mean stdv mean stdv mean stdv
Romantic 1 1 1 1 1 1
Thriller 1 1 1 1 1 1
Western 1 1 1 1 1 1
Вы получаете только единицы, потому что tabular
подсчитывает вхождения средств и sds, которые в этом случае, таким образом, все появляются один раз. Решение намечено на стр. 26: «Если термин оценивает функцию, это должна быть итоговая функция, которая производит скалярное значение при применении к вектору значений, и этот скаляр будет отображаться в таблице». Это немного хакерский sh, но это означает, что мы можем решить нашу проблему, предоставив «сводную» функцию, которая просто возвращает то же самое, что и ввод:
do_nothing <- function(X) {
X
}
tabular( Factor(genre) ~ Factor(origin) * ( do_nothing*mean + do_nothing*stdv ), data=movies )
И мы получаем:
origin
IT PL US
do_nothing do_nothing do_nothing do_nothing do_nothing do_nothing
genre mean stdv mean stdv mean stdv
Romantic 0.2503 0.3140 0.3334 0.2028 0.4629 0.02612
Thriller 0.1970 0.2746 0.3118 0.1713 0.4372 0.10926
Western 0.2503 0.2665 0.3214 0.1951 0.4689 0.06305
Остался только бесполезный заголовок. Мы можем избавиться от этого с помощью псевдофункции Heading()
:
tabular( Factor(genre) ~ Factor(origin) * ( Heading()*do_nothing*mean + Heading()*do_nothing*stdv ), data=movies )
И, наконец, у нас есть:
origin
IT PL US
genre mean stdv mean stdv mean stdv
Romantic 0.2503 0.3140 0.3334 0.2028 0.4629 0.02612
Thriller 0.1970 0.2746 0.3118 0.1713 0.4372 0.10926
Western 0.2503 0.2665 0.3214 0.1951 0.4689 0.06305
Это работает, отлично. Вопрос для размышления: есть ли более аккуратный, менее хакерский sh способ добиться этого, если у нас нет базовых данных?