如何在 R 中为一组变量 运行 频率 table 就像你在 SPSS 中说 FREQUENCIES var1 TO var10 一样?
How to run a frequency table in R for a set of variables like you would say FREQUENCIES var1 TO var10 in SPSS?
我正在尝试 运行 R 中的一组频率表,而不必为每个变量编写代码。例如,在 SPSS 中使用 mtcars 数据我会这样:
FREQUENCIES mpg TO vs
它会给我 mpg 和 vs 之间的变量的 8 个频率表。我试图在 R 中使用 summarytools
函数 freq
或 sjPlot
函数 view_df
。我可以使用 freq
来完成,但是你必须列出所有变量的名称,而不是使用像 TO
这样的命令。我可以使用 view_df
来做到这一点,但你必须知道变量的列位置(我有数千个变量,所以这是行不通的)。请看看我下面的内容。
#####USING FREQ IN SUMMARY TOOLS
library(summarytools)
freq(mtcars[ ,c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs")]) #works fine, but I don't want to have to list the names of all of the variables
#####USING VIEW_DF IN SJPLOT
library(sjPlot)
view_df(mtcars[, c(1:8)], #I want to be able to say c(mpg:vs)
show.na = TRUE,
show.type = TRUE,
show.frq = TRUE,
show.prc = TRUE,
show.string.values = TRUE,
show.id = TRUE)
####A FEW EXTRA STEPS USING THE EXPSS PACKAGE
我知道您可以使用 expss
包中的 %to%
。我这里有我自己的数据和变量名,抱歉!
# table with counts
counts = calculate(olbm_na_A, cro(mdset(S06_01_NA %to% S06_99_NA), list("Count")))
# table with percents
percents = calculate(olbm_na_A, cro_cpct(mdset(S06_01_NA %to% S06_99_NA), list("Column, %")))
# combine tables
expss_output_viewer()
(counts %merge% percents)
我希望它能打印出一系列频率表。我希望能够使用一些基本上意味着 var1 到 var10 的命令。我不知道如何执行此 TO
命令。我希望它因您使用的软件包而异。
我认为最简单的方法是使用 grep
和 colnames
按名称 return 变量的列索引。
grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars))
首先在 mtcars
的列名中找到 "mpg"
的位置(即 1),然后找到 "vs"
的位置(这是8)。然后,您可以使用 view_df 或 freq 解决方案,如下所示,或者有许多其他方法可以应用它。
freq(mtcars[grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars)), ])
view_df(mtcars[, grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars))], #I want to be able to say c(mpg:vs)
show.na = TRUE,
show.type = TRUE,
show.frq = TRUE,
show.prc = TRUE,
show.string.values = TRUE,
show.id = TRUE)
expss
包中有一个fre
函数:
library(expss)
data(mtcars)
mtcars = apply_labels(mtcars,
mpg = "Miles/(US) gallon",
cyl = "Number of cylinders",
disp = "Displacement (cu.in.)",
hp = "Gross horsepower",
drat = "Rear axle ratio",
wt = "Weight (lb/1000)",
qsec = "1/4 mile time",
vs = "Engine",
vs = c("V-engine" = 0,
"Straight engine" = 1),
am = "Transmission",
am = c("Automatic" = 0,
"Manual"=1),
gear = "Number of forward gears",
carb = "Number of carburetors"
)
# as.list is needed to process data.frame as several variables rather than multiple response
calculate(mtcars, fre(as.list(vs %to% carb)))
一般来说,您可以将 calculate
内的 %to%
与任何包中的任何其他函数一起使用。 %to%
简单地 returns data.frame,例如 vs %to% carb
等同于 mtcars[, c("vs", "am", "gear", "carb")]
。
sjPlot 示例:
library(sjPlot)
calc(mtcars, view_df(vs %to% carb))
SPSS 风格的频率-table,从 A 到 B,使用 sjmisc-package:
很容易执行
library(sjmisc)
frq(mtcars, mpg:vs)
# output in browser, to copy/paste to Word
frq(mtcars, mpg:vs, out = "b")
参见 ?frq
示例和不同选项,用于选择变量、计算分组数据帧的频率、对具有许多唯一值的变量进行分组等。并且 frq()
也适用于 labeled数据(见一些例子in this vignette)。
sjPlot::view_df()
创建一个代码计划并且对于简单的频率有点过载 - tables,尽管您也可以显示频率。最近 blog-post 展示了一些示例。
已经发布了非常好的解决方案,但这里有一个未被提及的 summarytools::freq()
和 dplyr::select()
的组合:
library(summarytools)
library(dplyr)
data("mtcars")
st_options(freq.ignore.threshold = nrow(mtcars))
mtcars %>% select(mpg:vs) %>% freq()
请注意,我们更改了 summarytools' 选项 freq.ignore.threshold
,该选项用于决定在将整个数据帧传递给 freq()
时要忽略哪些变量.具有超过该数量(默认为 25)的不同值的数值变量将被忽略。如果我们将它设置为 mtcars 的行数,我们确保所有变量都将被包括在内。
我正在尝试 运行 R 中的一组频率表,而不必为每个变量编写代码。例如,在 SPSS 中使用 mtcars 数据我会这样:
FREQUENCIES mpg TO vs
它会给我 mpg 和 vs 之间的变量的 8 个频率表。我试图在 R 中使用 summarytools
函数 freq
或 sjPlot
函数 view_df
。我可以使用 freq
来完成,但是你必须列出所有变量的名称,而不是使用像 TO
这样的命令。我可以使用 view_df
来做到这一点,但你必须知道变量的列位置(我有数千个变量,所以这是行不通的)。请看看我下面的内容。
#####USING FREQ IN SUMMARY TOOLS
library(summarytools)
freq(mtcars[ ,c("mpg", "cyl", "disp", "hp", "drat", "wt", "qsec", "vs")]) #works fine, but I don't want to have to list the names of all of the variables
#####USING VIEW_DF IN SJPLOT
library(sjPlot)
view_df(mtcars[, c(1:8)], #I want to be able to say c(mpg:vs)
show.na = TRUE,
show.type = TRUE,
show.frq = TRUE,
show.prc = TRUE,
show.string.values = TRUE,
show.id = TRUE)
####A FEW EXTRA STEPS USING THE EXPSS PACKAGE
我知道您可以使用 expss
包中的 %to%
。我这里有我自己的数据和变量名,抱歉!
# table with counts
counts = calculate(olbm_na_A, cro(mdset(S06_01_NA %to% S06_99_NA), list("Count")))
# table with percents
percents = calculate(olbm_na_A, cro_cpct(mdset(S06_01_NA %to% S06_99_NA), list("Column, %")))
# combine tables
expss_output_viewer()
(counts %merge% percents)
我希望它能打印出一系列频率表。我希望能够使用一些基本上意味着 var1 到 var10 的命令。我不知道如何执行此 TO
命令。我希望它因您使用的软件包而异。
我认为最简单的方法是使用 grep
和 colnames
按名称 return 变量的列索引。
grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars))
首先在 mtcars
的列名中找到 "mpg"
的位置(即 1),然后找到 "vs"
的位置(这是8)。然后,您可以使用 view_df 或 freq 解决方案,如下所示,或者有许多其他方法可以应用它。
freq(mtcars[grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars)), ])
view_df(mtcars[, grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars))], #I want to be able to say c(mpg:vs)
show.na = TRUE,
show.type = TRUE,
show.frq = TRUE,
show.prc = TRUE,
show.string.values = TRUE,
show.id = TRUE)
expss
包中有一个fre
函数:
library(expss)
data(mtcars)
mtcars = apply_labels(mtcars,
mpg = "Miles/(US) gallon",
cyl = "Number of cylinders",
disp = "Displacement (cu.in.)",
hp = "Gross horsepower",
drat = "Rear axle ratio",
wt = "Weight (lb/1000)",
qsec = "1/4 mile time",
vs = "Engine",
vs = c("V-engine" = 0,
"Straight engine" = 1),
am = "Transmission",
am = c("Automatic" = 0,
"Manual"=1),
gear = "Number of forward gears",
carb = "Number of carburetors"
)
# as.list is needed to process data.frame as several variables rather than multiple response
calculate(mtcars, fre(as.list(vs %to% carb)))
一般来说,您可以将 calculate
内的 %to%
与任何包中的任何其他函数一起使用。 %to%
简单地 returns data.frame,例如 vs %to% carb
等同于 mtcars[, c("vs", "am", "gear", "carb")]
。
sjPlot 示例:
library(sjPlot)
calc(mtcars, view_df(vs %to% carb))
SPSS 风格的频率-table,从 A 到 B,使用 sjmisc-package:
很容易执行library(sjmisc)
frq(mtcars, mpg:vs)
# output in browser, to copy/paste to Word
frq(mtcars, mpg:vs, out = "b")
参见 ?frq
示例和不同选项,用于选择变量、计算分组数据帧的频率、对具有许多唯一值的变量进行分组等。并且 frq()
也适用于 labeled数据(见一些例子in this vignette)。
sjPlot::view_df()
创建一个代码计划并且对于简单的频率有点过载 - tables,尽管您也可以显示频率。最近 blog-post 展示了一些示例。
已经发布了非常好的解决方案,但这里有一个未被提及的 summarytools::freq()
和 dplyr::select()
的组合:
library(summarytools)
library(dplyr)
data("mtcars")
st_options(freq.ignore.threshold = nrow(mtcars))
mtcars %>% select(mpg:vs) %>% freq()
请注意,我们更改了 summarytools' 选项 freq.ignore.threshold
,该选项用于决定在将整个数据帧传递给 freq()
时要忽略哪些变量.具有超过该数量(默认为 25)的不同值的数值变量将被忽略。如果我们将它设置为 mtcars 的行数,我们确保所有变量都将被包括在内。