r语言将第一列变为列名 r语言第一列作为行名_r语言将第一列变为列名

R语言数据处理全过程



R 语言作为一款功能强大的统计分析、绘图和数据挖掘软件,被社会科学领域的研究者们广泛应用于数据处理和图表制作等工作。由于 R 语言需要一定的编程基础,其开源属性又带来了千千万万的功能包(package),使得 R 语言的初学者常常不知从何入手,不知道学习哪些代码与功能包足够满足自己的统计需求。

因此,本文旨在介绍R语言中数据整理和分析的主要步骤,以及每一步需要的代码和功能包。本文以自变量为2 (social class: working vs. upper) × 2 (orientation: self vs. other ) × 10 (emotion: ...)的分类变量,因变量为scores连续变量的数据集为例,从原始数据导入,数据筛选和整理、描述性结果呈现、绘图、到常用统计方法的应用,进行一套完整的数据处理和统计分析流程的介绍。

本文主要参照 Data Skills for Reproducible Science 和作者本人的实战经验,希望对 R 语言的初学者有所帮助。

注:本文用于示例的数据及结果均为虚构 所需功能包如下: library(tidyverse)

library(readxl)

library(dplyr)


1. 原始数据导入



读取数据(数据文件须与 Rmd 文件在同一个文件夹中):

orig_data

以下是原始数据(Qualtrics中收集)在 R 中的视图,与在 Excel 中基本一样。点击右上角方框中的 orig.data 就能显示出。

orig_data 数据集:


r语言将第一列变为列名 r语言第一列作为行名_优秀的拆分(民间数据)c++_02

2. 数据筛选和整理



在对数据进行重新编码、清理、排序、重组等工作时,我们常使用 Excel 来完成,效率往往比较低下,做了很多重复性工作,导致头发减少和脾气暴躁。

R语言为数据整理提供了非常简便和灵活的功能包,通过三个步骤,就能将原始数据整理为可以用于统计分析的数据。

1) 筛选题目(列)并更改名称


在上图的原始数据集中有许多 Qualtrics 系统默认的题目,如 start date, end date, finished,以及后面的题目名 Q1, Q2 等。我们首先选出对我们有用的题目(列)。

运用 select( ) 命令进行选择,括号中可以为该列的名称(如 start data, end data, Q2, Q2 )或该列的编号 1,2,3。此处建议写名称,以免造成混乱。

select_data %

select(Q8, Q9, Q14, Q13, Q58, Q57, Q63, Q64, Q19, Q20, Q68, Q69, Q24, Q25, Q29, Q30, Q34, Q35, Q78, Q79, Q125, Q127, Q126, Q128)


筛选后 select_data 数据集如下:


r语言将第一列变为列名 r语言第一列作为行名_c++控制台应用每一列数据如何对齐_03


运用 rename( ) 命令对题目(列)名称进行更改: select_data %

select(Q8, Q9, Q14, Q13, Q58, Q57, Q63, Q64, Q19, Q20, Q68, Q69, Q24, Q25, Q29, Q30, Q34, Q35, Q78, Q79, Q125, Q127, Q126, Q128)%>%

rename(working_amusement_self = Q8, upper_amusement_self = Q9, working_awe_other = Q14, ...... )


rename( )中,=左侧为新名称,=右侧为旧名称。

注:不同命令(select, rename...)之间用%>%连接,表示在前一个命令完成后的数据集基础上进行下一个命令,省去了重新定义和引用数据集。

现在的 select_data 数据集


r语言将第一列变为列名 r语言第一列作为行名_数据集_04


2)筛选被试(行),并添加 id


上图中,行 1 和行 2 为系统默认的题目名称和编码,我们需要删除这两行:

select_data

上图 [ ] 中,第二个逗号左侧为 -c(1, 2) 表示删除第 1 和 2 行,第二个逗号右侧为空格,表示列不改变。

然后,我们用 mutate 命令添加一列 id,并使数列为 1, 2, 3, 4, ...,并用 select 先选择id,再选择其余的,以此将 id 置于最左侧。select_data %

mutate(id = row_number())%>%

select(id, everything())

现在的 select_data 数据集:


r语言将第一列变为列名 r语言第一列作为行名_c++控制台应用每一列数据如何对齐_05

3)重新组织数据
接下来,我们需要对数据集进行重组,以达到以下三个目标:
a. 每一个变量有自己的列
b. 每一个被试有自己的行
c. 每一个值有自己的空格
上图中,每一个题目(列)包含了三个变量信息(social class, orientation, emotion;如第一列 working_amusement_self。因此,我们需要让这三个变量有自己独立的一列。

3.1)将 N 列题目聚集为 1 列
定义一个新的数据集 tidy_data,引用 select_data 数据集,并对 N 列聚集:tidy_data %
gather("variables", "scores", 2:21)
运用 gather( ) 命令,将所选择的 N 列聚集为1列,聚集规则为将所选择的列的名称 (variables) 聚集为第一列,将所选择的列的值 (scores) 聚集为第二列,gather 括号中分别为这两列的名称以及选择的列的范围。
聚集之后的 tidy_data 数据集:

r语言将第一列变为列名 r语言第一列作为行名_r read.csv删除左侧序号_06

之后,我们需要将 variables 里每一行的三个变量分开,变为三列,这会让每一个 id 对应每一个变量,对应每一个 score。

3.2)将变量拆分为独立的列
运用 separate ( ) 将 variables 中的三个变量拆开,并对应到每一个 id 和 score。tidy_data %
gather("variables", "scores", 2:21)%>%
separate(variables, c("social_class", "emotion", "orientation"), sep = "_")
separate( ) 中第一个表示要拆分的列(variables),c( ) 中表示拆分之后三个变量的命名(“social class”, “emotion”, “orientation”),sep = 指分隔三个变量的符号“_”。
拆分后的 tidy_data 数据集:

r语言将第一列变为列名 r语言第一列作为行名_r read.csv删除左侧序号_07

对 id 排序后的 tidy_data 数据集:

r语言将第一列变为列名 r语言第一列作为行名_数据集_08

id1 的每一行表示,在某一 social class+emotion+orientation 条件下的 score。
到此,数据整理就基本完成了。在这个数据集的基础上,我们可以灵活运用以上命令,根据自己的需要,重新组织数据集。

▌拓展 

a. 用 filter( ) 筛选数据
在筛选数据时,除了用 select 进行整行和整列的选择以外,还可以用 filter( ) 定义某些规则,对某一列的数据进行筛选。规则如,大于 5、小于 10、不等于 0、等于 0 等等。具体参见 Data Skills for Reproducible Science 5.5.2

https://psyteachr.github.io/msc-data-skills/dplyr.html#filter

b. 定义变量的数据类型
在 R 中,如果变量的数据类型有误,在进行数据运算时会出现报错,因此在必要时我们手动定义数据类型。
- 查看数据类型
str( ) 括号中输入数据集名称,运行后会显示该数据集中各变量的类型(factor, characters, ...)
- 定义数据类型
将 scores 定义为数值,将 social class 定义为因素tidy_data$scores tidy_data$social_class

c. 计算均值并添加为列
很多时候,我们需要比较某个变量不同水平之间的均值是否有差异。例如,本例中,我们只想比较不同被试在 social class(working vs. upper)中的 scores 是否有差异。这种情况,我们就需要计算每个 id 的 working 和 upper 的 scores 的均值。
新定义一个数据集 tidy_data2,并引用 tidy_data1 的数据;用 group_by( ) 对数据集以 id 和 social class 分组;用 mutate( ) 生成一列数据,数据内容为 scores(分组后计算的)均值,用 select( ) 去掉不需要的列。tidy_data2 %
group_by(id, social_class)%>%
mutate(ave = mean(scores))%>%
select(-c(3:5))
tidy_data2 数据集如下:

r语言将第一列变为列名 r语言第一列作为行名_优秀的拆分(民间数据)c++_09


每一个被试拥有 working 和 upper 两个水平各自对应的 scores,该 scores 是由 emotion 和 orientation 的 scores 平均而来。

注:由于之前存在 emotion 和 orientation 对应的 scores 行,这些行在计算均值后仍保留在数据集中,ave 在这些行中重复出现。我们需要去掉内容重复的行:

tidy_data2

tidy_data2 数据集:


r语言将第一列变为列名 r语言第一列作为行名_优秀的拆分(民间数据)c++_10

3. 描述性结果呈现


1)计算均值和标准差


计算不同 social class 和 orientation 下 scores 的均值和标准差。

在 tidy_data 中,用 group_by( ) 将数据以 social class 和 orientation 分组;用 summarise( ) 呈现 mean 和 sd。

tidy_data%>%

group_by(social_class, orientation)%>%

summarise(mean = mean(scores), sd = sd(scores))


r语言将第一列变为列名 r语言第一列作为行名_优秀的拆分(民间数据)c++_11

4. 绘图


本节主要介绍如何使用 ggplot( ) 进行画图

为了展示不同类型的图,我们采用比较完整的数据集,即 tidy_data(包含 id, social class, emotion, orientation, scores)

代码结构:ggplot( ) + 图类型() + 其他设置

- 首先制作箱图,以 social class 为横坐标,scores 为纵坐标,emotion 为分类图例:

ggplot(tidy_data, aes(social_class, scores, fill = emotion))+

geom_boxplot(alpha = 0.5)

(此处省略一些花里胡哨的设置)


r语言将第一列变为列名 r语言第一列作为行名_数据集_12


用 ggsave( ) 保存图片 ggsave("Figure 1.jpg", width = 7, height = 4)

- 再做一个柱状图,以 social class 为横坐标,scores 为纵坐标,并计算 error bar。

ggplot(tidy_data, aes(social_class, scores, fill=social_class))+

  stat_summary(fun = mean, geom = "col", alpha = 0.5, width = 0.4)+

  stat_summary(fun.data = mean_se, geom = "errorbar", width = 0.2)+

  coord_cartesian(ylim = c(0,10))


r语言将第一列变为列名 r语言第一列作为行名_r read.csv删除左侧序号_13


对图的各种细节进行设置,如坐标轴上变量的顺序、变量名称、字体、填充颜色等等,谷歌一下就可以搜到具体代码。在此推荐一个我常借鉴的回答: https://www.datanovia.com/en/blog/ggplot-legend-title-position-and-labels/

另:两个连续变量可做散点图,线性图,热力图等,参考 Data Skills for Reproducible Science 3https://psyteachr.github.io/msc-data-skills/ggplot.html

5. 常用统计分析

在 tidy_data2 数据集基础上添加回 orientation,并计算 scores 均值。
tidy_data3 数据集如下:

r语言将第一列变为列名 r语言第一列作为行名_r语言将第一列变为列名_14

1)t检验:比较 social class 中 working 和 upper 的差异。t.test(ave~social_class, data = tidy_data2)
2)一般线性模型:分析 social class 与 orientation 在 ave 上的交互作用
可以用方差分析完成,也可以用一般线性模型。lm.1 summary(lm.1)
anova(lm.1)
一般线性模型(general linear model)可以完成方差分析、线性回归分析、相关分析等,非常实用和简便。
希望本文可以为大家提供帮助!作者信息:叶梓,阿姆斯特丹自由大学社会心理学硕士,莱顿大学社会心理学博士在读。主要研究方向:情绪表达、决策行为、择偶中的吸引力、人际过程排版:郭治辰 江西师范大学心理统计与测量专业硕士在读