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
,然后将函数 factor
和 ordered
应用于它们。如果字母顺序不是您想要的,您仍然可以自行改变列并提供 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
我有一个包含 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
,然后将函数 factor
和 ordered
应用于它们。如果字母顺序不是您想要的,您仍然可以自行改变列并提供 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