《R数据科学实战:工具详解与案例分析 》 —2.3.2 gather/spread—“长”“宽”数据转换

举报
华章计算机 发表于 2019/11/09 20:01:22 2019/11/09
【摘要】 本节书摘来自华章计算机《R数据科学实战:工具详解与案例分析》 一书中第二章,第2.3.2节,作者刘 健 邬书豪 。

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所示。

 image.png

图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函数中的参数及功能说明

image.png

 

2. spread—“长”数据变“宽”

函数spread是gather函数的逆向函数,即将“长”数据转换成“宽”数据。图2-2简要展示了函数的执行规则,将key列中的变量单独拆分成新列,value列中与变量中对应的数值同样会按规则进行放置。读者可以参考表2-14中的中文释义自行练习代码。

 image.png

图2-2 “长”数据变“宽”数据示意图

表2-14 函数spread参数及功能说明对照表

image.png

image.png


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。