📜  R-数据重塑

📅  最后修改于: 2020-11-29 07:47:16             🧑  作者: Mango


R中的数据重塑是关于改变数据组织成行和列的方式。大多数时候,R中的数据处理都是通过将输入数据作为数据帧来完成的。从数据帧的行和列中提取数据很容易,但是在某些情况下,我们需要的数据帧格式与接收数据的格式不同。 R具有许多功能,可将数据帧中的行拆分,合并和更改为列,反之亦然。

连接数据框中的列和行

我们可以使用cbind()函数将多个向量连接起来以创建数据帧。我们也可以使用rbind()函数合并两个数据帧。

# Create vector objects.
city 

当我们执行以上代码时,它产生以下结果-

# # # # The First data frame
     city       state zipcode
[1,] "Tampa"    "FL"  "33602"
[2,] "Seattle"  "WA"  "98104"
[3,] "Hartford" "CT"   "6161" 
[4,] "Denver"   "CO"  "80294"

# # # The Second data frame
       city       state   zipcode
1      Lowry      CO      80230
2      Charlotte  FL      33949

# # # The combined data frame
       city      state zipcode
1      Tampa     FL    33602
2      Seattle   WA    98104
3      Hartford  CT     6161
4      Denver    CO    80294
5      Lowry     CO    80230
6     Charlotte  FL    33949

合并数据框

我们可以使用merge()函数合并两个数据帧。数据框必须具有发生合并的相同列名。

在下面的示例中,我们考虑在图书馆名称“ MASS”中可用的有关Pima Indian Women糖尿病的数据集。我们根据血压(“ bp”)和体重指数(“ bmi”)的值合并两个数据集。选择这两列进行合并时,两个数据集中这两个变量的值匹配的记录将合并在一起以形成一个数据框。

library(MASS)
merged.Pima 

当我们执行以上代码时,它产生以下结果-

bp  bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y
1  60 33.8       1   117     23 0.466    27     No       2   125     20 0.088
2  64 29.7       2    75     24 0.370    33     No       2   100     23 0.368
3  64 31.2       5   189     33 0.583    29    Yes       3   158     13 0.295
4  64 33.2       4   117     27 0.230    24     No       1    96     27 0.289
5  66 38.1       3   115     39 0.150    28     No       1   114     36 0.289
6  68 38.5       2   100     25 0.324    26     No       7   129     49 0.439
7  70 27.4       1   116     28 0.204    21     No       0   124     20 0.254
8  70 33.1       4    91     32 0.446    22     No       9   123     44 0.374
9  70 35.4       9   124     33 0.282    34     No       6   134     23 0.542
10 72 25.6       1   157     21 0.123    24     No       4    99     17 0.294
11 72 37.7       5    95     33 0.370    27     No       6   103     32 0.324
12 74 25.9       9   134     33 0.460    81     No       8   126     38 0.162
13 74 25.9       1    95     21 0.673    36     No       8   126     38 0.162
14 78 27.6       5    88     30 0.258    37     No       6   125     31 0.565
15 78 27.6      10   122     31 0.512    45     No       6   125     31 0.565
16 78 39.4       2   112     50 0.175    24     No       4   112     40 0.236
17 88 34.5       1   117     24 0.403    40    Yes       4   127     11 0.598
   age.y type.y
1     31     No
2     21     No
3     24     No
4     21     No
5     21     No
6     43    Yes
7     36    Yes
8     40     No
9     29    Yes
10    28     No
11    55     No
12    39     No
13    39     No
14    49    Yes
15    49    Yes
16    38     No
17    28     No
[1] 17

熔铸

R编程最有趣的方面之一是分多个步骤更改数据的形状以获得所需的形状。用于执行此操作的函数称为melt()cast()

我们考虑存在于名为“ MASS”的库中的称为轮船的数据集。

library(MASS)
print(ships)

当我们执行以上代码时,它产生以下结果-

type year   period   service   incidents
1     A   60     60        127         0
2     A   60     75         63         0
3     A   65     60       1095         3
4     A   65     75       1095         4
5     A   70     60       1512         6
.............
.............
8     A   75     75       2244         11
9     B   60     60      44882         39
10    B   60     75      17176         29
11    B   65     60      28609         58
............
............
17    C   60     60      1179          1
18    C   60     75       552          1
19    C   65     60       781          0
............
............

融化数据

现在,我们将数据融为一体,将类型和年份以外的所有列转换为多行。

molten.ships 

当我们执行以上代码时,它产生以下结果-

type year  variable  value
1      A   60    period      60
2      A   60    period      75
3      A   65    period      60
4      A   65    period      75
............
............
9      B   60    period      60
10     B   60    period      75
11     B   65    period      60
12     B   65    period      75
13     B   70    period      60
...........
...........
41     A   60    service    127
42     A   60    service     63
43     A   65    service   1095
...........
...........
70     D   70    service   1208
71     D   75    service      0
72     D   75    service   2051
73     E   60    service     45
74     E   60    service      0
75     E   65    service    789
...........
...........
101    C   70    incidents    6
102    C   70    incidents    2
103    C   75    incidents    0
104    C   75    incidents    1
105    D   60    incidents    0
106    D   60    incidents    0
...........
...........

投放熔火数据

我们可以将合并的数据转换为新的形式,以创建每年每种船舶的汇总。这是使用cast()函数的。

recasted.ship 

当我们执行以上代码时,它产生以下结果-

type year  period  service  incidents
1     A   60    135       190      0
2     A   65    135      2190      7
3     A   70    135      4865     24
4     A   75    135      2244     11
5     B   60    135     62058     68
6     B   65    135     48979    111
7     B   70    135     20163     56
8     B   75    135      7117     18
9     C   60    135      1731      2
10    C   65    135      1457      1
11    C   70    135      2731      8
12    C   75    135       274      1
13    D   60    135       356      0
14    D   65    135       480      0
15    D   70    135      1557     13
16    D   75    135      2051      4
17    E   60    135        45      0
18    E   65    135      1226     14
19    E   70    135      3318     17
20    E   75    135       542      1