`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():将长数据转换为宽数据。
- 数据整理的灵活性:根据分析需求灵活调整数据的组织方式,不要害怕多次转换。
通过这些工具,你可以轻松地将数据从一种格式转换为另一种格式,从而更好地进行数据分析和可视化。
