1

我试图在 R 中运行一组频率表,而不必为每个变量编写代码。例如,在 SPSS 中使用 mtcars 数据我会这样:

FREQUENCIES mpg TO vs 

它会给我 mpg 和 vs 之间的变量的 8 个频率表。我试图在 R 中使用summarytoolsfunctionfreqsjPlotfunction来获得这种效果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命令。我希望它因您使用的软件包而异。

4

4 回答 4

0

我认为最简单的方法是使用grep并按colnames名称返回变量的列索引。

grep("mpg", colnames(mtcars)) : grep("vs", colnames(mtcars)) 

通过首先c(1:8)找到(1)"mpg"的列名中的位置,然后找到(8) 的位置。然后,您可以使用 view_df 或 freq 解决方案,如下所示,或者有许多其他方法可以应用它。mtcars"vs"

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)
于 2019-05-03T17:23:12.167 回答
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%insidecalculate与任何包中的任何其他功能。%to%只需返回 data.frame,例如 vs %to% carbmtcars[, c("vs", "am", "gear", "carb")].

sjPlot 示例:

library(sjPlot)
calc(mtcars, view_df(vs %to% carb))
于 2019-05-03T20:17:16.533 回答
0

SPSS 风格的频率表,从 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()还适用于标记数据(请参阅此小插图中的一些示例)。

sjPlot::view_df()创建一个代码计划并且对于简单的频率表来说有点过载,尽管您也可以显示频率。最近有一篇博客文章展示了一些示例。

于 2019-05-06T14:14:36.337 回答
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 的行数,我们确保将包含所有变量。

于 2020-06-06T06:50:25.690 回答