跳至主要内容

R 中的数据重整(Data Reshaping)教程

学习 R 中的数据重整,了解 rbind()、cbind()、Melt()、Dcast() 等函数,以及转置(transpose)函数。
· 7分钟 阅读

使用 AI 探索

R 中的数据重整(Data Reshaping)类似于按照您的需求重新排列行与列。大多数情况下,数据会以 R 中的数据框(data frame) 形式进行处理,使用诸如 "rbind()"、"cbind()" 等函数。

在此过程中,您会将数据重新塑形或重组为行和列。重整就是以特定方式重新组织数据,以便后续处理。

创建您的数据

我们来创建一个随机数生成器,并构造列以便在数据框中连接。同时插入 id 以备后用。"set.seed(123)" 用于生成随机数,保证任何人在任何机器上使用时都能重现相同的样本。创建了三个变量 colm1、colm2、colm3。借助 "sample()",从 1 到 15 生成取值,并允许重复。同时使用数据框以表格形式存储数据,并加入唯一编号的 id。

set.seed(123)
N <- 15
colm1  <- sample(1:15, N, replace=TRUE)
colm2  <- sample(1:15, N, replace=TRUE)
colm3  <- sample(1:15, N, replace=TRUE)
df_Temp <- data.frame(colm1, colm2,colm3)
df_Temp$id<-seq(nrow(df_Temp))
df_Temp

上述代码得到如下输出,其中有三列,分别命名为 "colm1"、"colm2"、"colm3",并包含从 1 到 15 的 id。各列的取值来自 1 到 15,部分数字会重复,部分数字可能未出现。

 colm1   colm2   colm3  id
  15      11     14     1
  15      5      3      2
  3       3      4      3
  14      11     14     4
  3       9      1      5
  10      12     11     6
  2       9      7      7
  6       9      5      8
  11      13     12     9
  5       3      15     10
  4       8      10     11
  14      10     13     12
  6       7      7      13
  9       10     9      14
 10       9      9      15 

cbind 函数

用法:按列合并向量、矩阵和数据框。
参数:cbind(v1,v2):v1、v2 可以是向量、矩阵或数据框

让我们看一个绑定的示例。

可以通过 "df_Temp[,4]" 选择 id,而 "df_Temp[,2]" 选择 df_Temp 的 "colm2",如下所示,这两者作为 "cbind()" 的参数,并存储在变量 "cbindexample" 中。之后可借助 "colnames()" 更改列名,它接收变量并将向量输入 c 指定为新值,即 "newid"、"new_colm2"。

cbindexample<-cbind(df_Temp[,4],df_Temp[,2])
colnames(cbindexample)<- c('newid','new_colm2')
cbindexample

上述代码产生如下输出,您可以用 "cbind" 函数将 id 与第 2 列两列绑定,生成一个新的数据框。同时,将列名改为 "new_colm2",而 "id" 改为 "newid"。

newid   new_colm2
1         11
2         5
3         3
4         11
5         9
6         12
7         9
8         9
9         13
10         3
11         8
12         10
13         7
14         10
15         9

rbind 函数:

用法:rbind 用于按列名匹配、按行合并向量、矩阵或数据框。
参数:rbind(v1,v2):v1、v2 可以是向量、矩阵或数据框。

创建一个名为 "new_vector" 的新向量,并使用 "rbind" 将其与由两列构成的 "cbindexample" 合并,二者拼接后存入 "rbindexample"。

new_vector<- c(16,15)
rbindexample<- rbind(cbindexample,new_vector)
rbindexample

上述代码得到如下输出,其中在 "newid" 和 "new_colm2" 中分别新增一行,取值为 16 和 15。

newid    new_colm2
1        11
2        5
3        3
4        11
5        9
6        12
7        9
8        9
9        13
10       3
11       8
12       10
13       7
14       10
15       9
16       15

Melt 函数:

用法:Melt 函数用于将对象转换为“熔化”状态,即将多列数据转换为单列数据。
参数:melt(data,…,na.rm=FALSE/TRUE, value.name=”value” ),
data:要进行 melt 的输入数据。
...:传入或传出的其他输入。
na.rm:用于将显式缺失值转换为隐式缺失。
value.name:用于存放值的变量名。
下面的代码展示了如何使用 id 变量将数据“熔化”为包含列名与取值的一列:

使用 "library()" 导入名为 "reshape2" 的库,并使用 melt 将 dfTemp 中的 colm1、colm2、colm3 按照 "id" 变量合并到名为 "variable" 的单一位置。

library(reshape2)
molted=melt(df_Temp,id.vars=c("id"))
molted
id    variable value
1    colm1    15
2    colm1     15
3    colm1     3
4    colm1     14
5    colm1     3
6    colm1     10
7    colm1     2
8    colm1     6
9    colm1     11
10    colm1     5
11    colm1     4
12    colm1     14
13    colm1     6
14    colm1     9
15    colm1     10
1    colm2     11
2    colm2     5
3    colm2     3
4    colm2     11
5    colm2     9
6    colm2     12
7    colm2     9
8    colm2     9
9    colm2     13
10    colm2     3
11    colm2     8
12    colm2     10
13    colm2     7
14    colm2     10
15    colm2     9
1    colm3     14
2    colm3     3
3    colm3     4
4    colm3     14
5    colm3     1
6    colm3     11
7    colm3     7
8    colm3     5
9    colm3     12
10    colm3     15
11    colm3     10
12    colm3     13
13    colm3     7
14    colm3     9
15    colm3     9

上述输出显示:当您根据 id 变量对 colm1、colm2、colm3 进行熔化时,它们被合并到名为 "variable" 的一列中,而各列的取值存放在 "value" 中。

Dcast 函数:

用法:当您有一个熔化后的数据集时,可以用该函数将其还原为原始格式。
参数:dcast(data,id_variable~value),
data:需要还原为原始形式的熔化数据。
id_variable:用于将其他列熔化为一列时所用的一个或多个列。
~:在该符号之后,放置熔化数据集中表示新列的变量。

如下代码所示,使用 "library()" 导入 "reshape2","dcast()" 的第一个参数为执行过 "molt()" 的数据,以及带有 id 的 "~" 符号以形成新的熔化列。

library(reshape2)
dcast(molted,id~variable)
id    colm1    colm2    colm3
1        15        11        14
2        15        5         3
3        3        3         4
4        14        11       14
5        3        9         1
6        10        12        11
7        2         9         7
8        6        9         5
9       11        13        12
10       5        3        15
11       4        8        10
12       14        10        13
13       6        7        7
14       9        10        9
15      10        9        9

您可以看到,经过 "molt()" 之后的数据又被还原回原始数据集。共有三列及其各自的取值,id 单独在一列。

转置(Transpose)函数:

用法:用于将行变为列、列变为行。
参数:t(data),data 为需要传入并进行转置的数据框。

我们使用转置函数将行变为列,列变为行。只需使用 "t(df_Temp)",如下所示。

trans <- t(df_Temp)
trans

上述代码得到如下输出:

colm1    15    15    3    14    3    10    2    6    11    5    4    14    6    9    10
colm2    11    5    3    11    9    12    9    9    13    3    8    10    7    10    9
colm3    14    3    4    14    1    11    7    5    12    15    10    13    7    9    9
id    1    2    3    4    5    6    7    8    9    10    11    12    13    14    15

您可以看到,原本为 15 行 4 列的数据框,转置后变为 15 列 3 行。

恭喜

恭喜您读完本教程!

在本教程中,您学习了 R 的不同函数,如 "rbind()"、"cbind()",以及 "Melt()"、"Dcast()",最后还有转置函数。

如果您想进一步学习 R,请参加 DataCamp 的 Introduction to R 课程,并查看我们的 R Packages: A Beginner's Tutorial。

参考资料:
Melt 函数

主题