我试图在R中运行一组频率表,而不必为每个变量编写代码。例如,在SPSS中使用mtcars数据,我会这样:
FREQUENCIES mpg TO vs
这将为我提供mpg和vs之间的变量的8个频率表。我正在尝试使用summarytools
函数freq
或sjPlot
在R中获得这种效果函数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
我知道您可以在%to%
包中使用expss
。我在这里有自己的数据和变量名,对不起!
# 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
命令。我希望它随您使用的软件包而有所不同。
答案 0 :(得分:0)
我认为最简单的方法是使用grep
和colnames
按名称返回变量的列索引。
grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars))
通过首先在c(1:8)
列名称(即1)中找到"mpg"
的位置,然后在mtcars
的位置中找到{p 8)。然后,您可以使用如下所示的view_df或freq解决方案,或者有许多其他方法可以应用此解决方案。
"vs"
答案 1 :(得分:0)
fre
包中有一个expss
函数:
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)))
通常来说,您可以将%to%
内的calculate
与任何软件包中的任何其他功能一起使用。 %to%
仅返回data.frame,例如vs %to% carb
与mtcars[, c("vs", "am", "gear", "carb")]
相同。
带有sjPlot的示例:
library(sjPlot)
calc(mtcars, view_df(vs %to% carb))
答案 2 :(得分:0)
使用sjmisc-package,可以很容易地执行从A到B的SPSS样式的频率表:
library(sjmisc)
frq(mtcars, mpg:vs)
# output in browser, to copy/paste to Word
frq(mtcars, mpg:vs, out = "b")
有关示例和选择变量,在分组数据帧上计算频率,将变量具有许多唯一值分组等的示例和不同选项,请参见?frq
。frq()
也可用于标记数据(请参见示例in this vignette)。
sjPlot::view_df()
创建了一个代码计划,并且对于简单的频率表来说有点过载,尽管您也可以显示频率。最近有blog-post展示了一些示例。
答案 3 :(得分:0)
已经发布了非常好的解决方案,但这是尚未提及的结合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)的不同值的数字变量将被忽略。如果将其设置为mtcar的行数,则确保将所有变量都包括在内。