Как правильно разобрать (?) Mdsets в expss в пределах al oop? - PullRequest
1 голос
/ 20 февраля 2020

Я новичок в R и пока не знаю всех базовых c концепций. Задача состоит в том, чтобы создать одну объединенную таблицу с несколькими наборами ответов. Я пытаюсь сделать это, используя expss library и al oop.

Это код в R без al oop (работает нормально):

#libraries
#blah, blah...

#path
df.path = "C:/dataset.sav"

#dataset load
df = read_sav(df.path)

#table
table_undropped1 = df %>%
  tab_cells(mdset(q20s1i1 %to% q20s1i8)) %>%
  tab_total_row_position("none") %>%
  tab_stat_cpct() %>%
  tab_pivot()

Существует 10 множественных наборов ответов, поэтому мне нужно создать 10 таблиц способом, показанным выше. Затем я перемещаю эти таблицы и объединяю их. Чтобы упростить код (и узнать что-то новое), я решил создать таблицы, используя al oop. Однако ничего не работает. Я искал решение, и я думаю, что наиболее близким к правильному является:

#this generates a message: '1' not found
for(i in 1:10) {
  assign(paste0("table_undropped",i),1) = df %>%
    tab_cells(mdset(assign(paste0("q20s",i,"i1"),1) %to% assign(paste0("q20s",i,"i8"),1)))
    tab_total_row_position("none") %>%
    tab_stat_cpct() %>%
    tab_pivot()
}

Тем не менее оно вызывает ошибку, описанную выше кода.

В качестве альтернативы макрос SPSS для этого будет (опубликовано только для лучшей express проблемы, потому что я должен избегать SPSS):

define macro1 (x = !tokens (1)
/y = !tokens (1))

!do !i = !x !to !y.

mrsets
/mdgroup name = !concat($SET_,!i)
variables = !concat("q20s",!i,"i1") to !concat("q20s",!i,"i8")
value = 1.

ctables
/table !concat($SET_,!i) [colpct.responses.count pct40.0].

!doend
!enddefine.

*** MACRO CALL.
macro1 x = 1 y = 10.

Другими словами, я ищу рабочую замену !concat() в R.

1 Ответ

0 голосов
/ 20 февраля 2020

%to% не подходит для выбора параметров c. Существует набор специальных функций для параметрирования c выбора и назначения переменных. Одним из них является mdset_t:

for(i in 1:10) {
    table_name = paste0("table_undropped",i) 
    ..$table_name = df %>%
        tab_cells(mdset_t("q20s{i}i{1:8}")) %>% # expressions in the curly brackets will be evaluated and substituted 
        tab_total_row_position("none") %>%
        tab_stat_cpct() %>%
        tab_pivot()
}

Однако не рекомендуется хранить все таблицы как отдельные переменные в глобальной среде. Лучше всего сохранить все таблицы в списке:

all_tables = lapply(1:10, function(i)
                    df %>%
                        tab_cells(mdset_t("q20s{i}i{1:8}")) %>% 
                        tab_total_row_position("none") %>%
                        tab_stat_cpct() %>%
                        tab_pivot()
                    )

ОБНОВЛЕНИЕ. Вообще говоря, нет необходимости в слиянии. Вы можете сделать всю свою работу с tab_*:

my_big_table = df %>%
    tab_total_row_position("none")

for(i in 1:10) {
    my_big_table = my_big_table %>%
        tab_cells(mdset_t("q20s{i}i{1:8}")) %>% # expressions in the curly brackets will be evaluated and substituted 
        tab_stat_cpct() 
}

my_big_table = my_big_table %>%
    tab_pivot(stat_position = "inside_columns") # here we say that we need combine subtables horizontally
...