`tidyverse` 长表、宽表的处理
1. 整洁数据(Tidy Data)的核心概念
整洁数据的基本原则是:
- 每个变量是一列。
- 每个观测是一行。
- 每个值是一个单元格。
这种数据格式非常适合数据分析和可视化,因为大多数数据分析工具(如 dplyr
和 ggplot2
)都是基于这种格式设计的。
2. pivot_longer()
:将宽数据转换为长数据
pivot_longer()
函数用于将宽数据(wide data)转换为长数据(long data)。宽数据的特点是变量分布在多列中,而长数据的特点是变量集中在少数几列中。
基本语法
pivot_longer(data,cols,names_to,values_to,values_drop_na = FALSE,names_sep = NULL,names_pattern = NULL
)
data
:要转换的数据框。cols
:需要转换的列。names_to
:列名对应的变量名。values_to
:单元格值对应的变量名。values_drop_na
:是否删除缺失值。names_sep
或names_pattern
:用于处理复杂列名,将列名拆分为多个变量。
示例
假设我们有一个宽数据集 billboard
,其中列名包含变量信息:
billboard <- data.frame(artist = c("Adele", "Beyonce"),song = c("Hello", "Formation"),week1 = c(100, 200),week2 = c(150, 250),week3 = c(120, 220)
)
使用 pivot_longer()
将其转换为长数据:
library(tidyr)billboard_long <- billboard %>%pivot_longer(cols = week1:week3, # 指定需要转换的列names_to = "week", # 列名对应的变量名values_to = "sales" # 单元格值对应的变量名)print(billboard_long)
输出结果:
# A tibble: 6 × 4artist song week sales<chr> <chr> <chr> <dbl>
1 Adele Hello week1 100
2 Adele Hello week2 150
3 Adele Hello week3 120
4 Beyonce Formation week1 200
5 Beyonce Formation week2 250
6 Beyonce Formation week3 220
3. pivot_wider()
:将长数据转换为宽数据
pivot_wider()
函数用于将长数据(long data)转换为宽数据(wide data)。长数据的特点是变量集中在少数几列中,而宽数据的特点是变量分布在多列中。
基本语法
pivot_wider(data,names_from,values_from,id_cols = NULL
)
data
:要转换的数据框。names_from
:列名的来源列。values_from
:值的来源列。id_cols
:唯一标识行的列。
示例
假设我们有一个长数据集 cms_patient_experience
,其中每个组织的测量结果分布在多行中:
cms_patient_experience <- data.frame(organization = c("Org1", "Org1", "Org2", "Org2"),measure = c("Quality", "Safety", "Quality", "Safety"),score = c(80, 90, 85, 95)
)
使用 pivot_wider()
将其转换为宽数据:
cms_patient_experience_wide <- cms_patient_experience %>%pivot_wider(names_from = measure, # 列名的来源列values_from = score, # 值的来源列id_cols = organization # 唯一标识行的列)print(cms_patient_experience_wide)
输出结果:
# A tibble: 2 × 3organization Quality Safety<chr> <dbl> <dbl>
1 Org1 80 90
2 Org2 85 95
好的,我来详细解释一下第4部分的内容,特别是如何处理复杂列名,以及如何使用 pivot_longer()
函数中的 names_to
、names_sep
和 names_pattern
参数。
第4部分:处理复杂列名
1. 问题背景
在实际数据中,列名可能包含多个变量的信息。例如,列名可能是“变量名_变量值1_变量值2”的形式。这种情况下,我们需要将这些列名拆分为多个变量,以便更好地进行数据分析。
2. 示例数据集
假设我们有一个数据集 who2
,列名中包含诊断方法、性别和年龄范围等信息:
who2 <- data.frame(country = c("Country1", "Country2"),diag1_male_0_14 = c(10, 20),diag1_female_0_14 = c(15, 25),diag2_male_15_24 = c(30, 40),diag2_female_15_24 = c(35, 45)
)
在这个数据集中:
diag1_male_0_14
表示诊断方法为diag1
,性别为male
,年龄范围为0_14
的数据。diag1_female_0_14
表示诊断方法为diag1
,性别为female
,年龄范围为0_14
的数据。- 以此类推。
3. 目标
我们需要将这些列名拆分为多个变量,以便将数据转换为长格式(long format)。具体来说,我们需要将列名中的信息提取出来,形成以下几列:
diag
:诊断方法gender
:性别age_range
:年龄范围value
:对应的值
4. 使用 pivot_longer()
函数
pivot_longer()
函数可以将宽数据转换为长数据。我们可以通过 names_to
参数指定新的列名,通过 names_sep
或 names_pattern
参数来拆分列名。
参数说明
cols
:指定需要转换的列。names_to
:指定列名对应的变量名。- 如果列名中包含多个变量信息,可以使用
names_to = c("变量1", "变量2", ...)
。 - 如果列名中包含变量名和变量值,可以使用
.value
作为特殊占位符。
- 如果列名中包含多个变量信息,可以使用
names_sep
:用于拆分列名的分隔符。names_pattern
:用于拆分列名的正则表达式。
示例代码
library(tidyr)who2_long <- who2 %>%pivot_longer(cols = -country, # 排除 country 列names_to = c(".value", "gender", "age_range"), # 使用 .value 提取变量名和变量值names_pattern = "(\\w+)_(\\w+)_(\\d+)_?(\\d+)?")print(who2_long)
5. 参数解释
cols = -country
:表示排除country
列,只对其他列进行操作。names_to = c(".value", "gender", "age_range")
:.value
是一个特殊占位符,表示列名中变量名的部分(如diag1
、diag2
)。gender
和age_range
是我们希望提取的其他变量信息。
names_pattern = "(\\w+)_(\\w+)_(\\d+)_?(\\d+)?"
:- 这是一个正则表达式,用于匹配列名的结构。
(\\w+)
匹配一个或多个字母或数字,对应diag1
、diag2
。(\\w+)
匹配性别部分,如male
、female
。(\\d+)_?(\\d+)?
匹配年龄范围,如0_14
、15_24
。
6. 输出结果
# A tibble: 8 × 5country diag gender age_range value<chr> <chr> <chr> <chr> <dbl>
1 Country1 diag1 male 0_14 10
2 Country1 diag1 female 0_14 15
3 Country1 diag2 male 15_24 30
4 Country1 diag2 female 15_24 35
5 Country2 diag1 male 0_14 20
6 Country2 diag1 female 0_14 25
7 Country2 diag2 male 15_24 40
8 Country2 diag2 female 15_24 45
总结
names_to
:指定列名对应的变量名,可以使用.value
提取变量名。names_pattern
:使用正则表达式匹配列名的结构,提取多个变量信息。names_sep
:如果列名是用固定分隔符分隔的,可以使用names_sep
参数。
通过这些参数,你可以灵活地处理复杂的列名,将宽数据转换为长数据,从而更好地进行数据分析和可视化。
5. 总结
- 整洁数据的重要性:整洁数据格式便于使用
tidyverse
工具进行分析。 - 数据整理工具:
pivot_longer()
:将宽数据转换为长数据。pivot_wider()
:将长数据转换为宽数据。
- 数据整理的灵活性:根据分析需求灵活调整数据的组织方式,不要害怕多次转换。
通过这些工具,你可以轻松地将数据从一种格式转换为另一种格式,从而更好地进行数据分析和可视化。