《R数据科学实战:工具详解与案例分析 》 —2.3.2 gather/spread—“长”“宽”数据转换
2.3.2 gather/spread—“长”“宽”数据转换
1. gather—“宽”变“长”
2.1节讨论了“宽”数据格式的弊端,所以推荐将数据转换成“长”数据—全部变量名称为一列,相关数值为一列。gather函数因此而生。图2-1所示的示例用箭头标识出了数据由“宽”变“长”的具体路线。在理想情况下,整洁的数据框应为如图2-1a所示的格式,因子水平一列(性别),变量(或指标)一列,剩余所有数值型数据一列。
读者可以使用2.2.2节中介绍的tribble函数来构建如图2-1b所示的“脏”数据框,然后使用以下代码实现从“脏”和“宽”的形式到“干净”和“长”的转换。在代码清单2-1中,笔者将“脏”数据保存在名为df的数据框中(此处略去创建数据集的代码),然后使用管道函数“%>%”,将df传递给gather函数(中文释义见表2-13),因为管道函数的存在,所以无须重新引用df,而以“.”来代替,指定指标列为key,数值列为value,保留序号列(保留列需要使用负号加列名的形式进行设置),并移除默认值。之后会得到一个中间产物数据框,该数据框指标列中的“性别”和指标虽然以空格分隔开,但仍然在一列中,不满足“干净”数据的原则。所以再次使用管道函数将中间产物的数据框,传递给函数separate(详见2.3.3节),将key列拆分成两列,分别为性别和key,此时的数据库便如图2-1a所示。
图2-1 “宽”数据变“长”数据示意图
代码清单2-1 gather和separate函数基本使用示例
> df %>%
gather(data = .,key = key, value = value, ... = -序号, na.rm = T) %>%
separate(data = .,key, into = c("性别","key"))
小知识
上述代码中的“%>%”为'magrittr'包中的 forward-pipe operator,中文可以理解为管道函数。该函数能够与'tidyverse'内的所有函数完美结合使用,且易于理解记忆。有兴趣的读者可以尝试运行指令“?'%>%'”来查看具体的英文帮助。
因为tidy系列中各个的函数的结构非常简洁清晰,因此当读者熟悉各种参数的位置情况之后,完全可以省略各种参数名称,而只依靠位置来进行传参,具体代码如下:
> df %>%
gather(key, value, -序号, na.rm = T) %>%
separate(key, c("性别","key"))
表2-13 gather函数中的参数及功能说明
2. spread—“长”数据变“宽”
函数spread是gather函数的逆向函数,即将“长”数据转换成“宽”数据。图2-2简要展示了函数的执行规则,将key列中的变量单独拆分成新列,value列中与变量中对应的数值同样会按规则进行放置。读者可以参考表2-14中的中文释义自行练习代码。
图2-2 “长”数据变“宽”数据示意图
表2-14 函数spread参数及功能说明对照表
- 点赞
- 收藏
- 关注作者
评论(0)