如何在循环中正确解析 expss 中的 (?) mdsets?
How to properly parse (?) mdsets in expss within a loop?
我是 R 的新手,我还不知道所有的基本概念。任务是生成一个包含多个响应集的 table。我正在尝试使用 expss
库 和一个循环 .
这是 R 中没有循环的代码(工作正常):
#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 个 table。然后我转置那些 tables 并合并。为了简化代码(并学习新东西),我决定使用循环生成 tables。但是没有任何效果。我一直在寻找解决方案,我认为最接近正确的解决方案是:
#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 宏可以是(发布只是为了更好地表达问题,因为我必须避免使用 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.
换句话说,我正在寻找 R 中 !concat()
的工作替代品。
%to%
不适用于参数变量选择。有一组用于参数变量选择和分配的特殊函数。其中之一是 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
我是 R 的新手,我还不知道所有的基本概念。任务是生成一个包含多个响应集的 table。我正在尝试使用 expss
库 和一个循环 .
这是 R 中没有循环的代码(工作正常):
#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 个 table。然后我转置那些 tables 并合并。为了简化代码(并学习新东西),我决定使用循环生成 tables。但是没有任何效果。我一直在寻找解决方案,我认为最接近正确的解决方案是:
#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 宏可以是(发布只是为了更好地表达问题,因为我必须避免使用 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.
换句话说,我正在寻找 R 中 !concat()
的工作替代品。
%to%
不适用于参数变量选择。有一组用于参数变量选择和分配的特殊函数。其中之一是 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