R 基础知识:一次处理多个变量及其输出

R basics: working with multiple variables at once and their output

我有一个包含 40 个有序因子变量的调查数据集。当数据为 imported.Please 时,变量将转换为字符,如果我错了,请纠正我,因为我正在考虑在此处使用 apply function

下面我的数据操作:

### data    
v1 <- as.character(c(1,4,2,4,3,1,3,4,5,2,2,3,6,5,4,6,5,4,5,6,6,2,4,3,4,5,6,1,6,3,5,6,3,2,4,5,3,2,4,5,3,2,4))
v2 <- as.character(c(3,4,1,4,5,1,3,1,5,6,4,3,4,5,6,3,3,5,4,3,3,5,6,3,4,3,4,6,3,1,1,3,4,5,6,1,3,6,4,3,1,6,5))

df <- data.frame(v1,v2)

### transform into ordered factor

df$v1.f <- as.factor(df$v1)
df$v1.f <- ordered(df$v1.f, levels = c("1", "2", "3", "4", "5", "6"))

真正的关卡是未排序的字符,这就是我加入这一步的原因。我不介意为所有变量输入这个,但这似乎是多余的。

我的第二个问题是输出。我想创建一个精美的报告并知道如何为其生成数字:

v1.freq <- table(df$v1.f)
v1.perc <- round(prop.table(v1.freq),2)*100
v1.med <- median(df$v1)

如何打印一次包含多个变量的所有变量的所有信息的 table - 特别是当没有某个级别的答案时(参见 v2,其中有level 2 无响应;table() 直接跳过该级别)。

如何将 table 中的 R 输出转换为 headers 级别,频率和百分比作为多个变量的行?

Copy/pasting 数字变成 Excel Sheet 似乎-再次-不必要并且容易出错。

首先,您可能需要检查您的数据导入功能是否有 stringAsFactor 选项。

然后,据我了解,您想要将变量转换为有序因子,这适用于所有这些因子。您可以将其包装成一个 dplyr 句子,并使用 forcats 来处理因子。让我们获取您的数据:

library(tidyverse)
df %>% 
  mutate(across(1:2, ~factor(.))) %>% 
  mutate(across(1:2,~ordered(.))) %>% 
  str()

输出:

'data.frame':   43 obs. of  2 variables:
 $ v1: Ord.factor w/ 6 levels "1"<"2"<"3"<"4"<..: 1 4 2 4 3 1 3 4 5 2 ...
 $ v2: Ord.factor w/ 5 levels "1"<"3"<"4"<"5"<..: 2 3 1 3 4 1 2 1 4 5 ...

如您所见,变量转换为有序因子,水平按字母顺序排列。解释一下,mutate 是改变你的变量,across 指定你想改变哪些变量,以及如何改变。在这里,我们要将变量 1 突变为 2,然后将函数 factorordered 应用于它们。如果字母顺序不是您想要的,您仍然可以自行改变列并提供 levels 参数。

对于第二个问题,就V2没有级别“2”而言,与V1不同,你不能合并两个变量,除非你为V2添加一个NA级别。您仍然可以检查 janitor::tabyl 以获得交叉频率,并为每个变量创建一个 table:

library(janitor)
df2 <- df %>% 
  mutate(across(1:2, ~factor(.))) %>% 
  mutate(across(1:2,~ordered(.)))

map(df2, tabyl)

输出:

$v1
 .x[[i]]  n    percent
       1  3 0.06976744
       2  7 0.16279070
       3  8 0.18604651
       4 10 0.23255814
       5  8 0.18604651
       6  7 0.16279070

$v2
 .x[[i]]  n   percent
       1  7 0.1627907
       3 13 0.3023256
       4  9 0.2093023
       5  7 0.1627907
       6  7 0.1627907