开发手册 欢迎您!
软件开发者资料库

R - 数据重塑

R数据重塑 - 从基本概念到高级概念,从简单简单的步骤学习R编程语言,包括R安装,语言基础,语法,文字,数据类型,变量,函数,循环,决策,模块,数组,列表,矢量,数学,矩阵,统计,图形,Excel数据,csv数据,概述,环境设置,运算符,字符串,因子,数据框,包,数据整形,二进制文件,XML文件,Json文件,Web数据,数据库,饼图图表,条形图,箱线图,直方图,线图,散点图,平均值,中位数和模式,线性回归,多元回归,Logistic回归,正态分布,二项分布,泊松回归,协方差分析,时间序列分析,非线性最小二乘,决策树,随机森林,生存分析,卡方检验。

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

在数据框中连接列和行

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

# Create vector objects.city <- c("Tampa","Seattle","Hartford","Denver")state <- c("FL","WA","CT","CO")zipcode <- c(33602,98104,06161,80294)# Combine above three vectors into one data frame.addresses <- cbind(city,state,zipcode)# Print a header.cat("# # # # The First data frame\n") # Print the data frame.print(addresses)# Create another data frame with similar columnsnew.address <- data.frame(   city = c("Lowry","Charlotte"),   state = c("CO","FL"),   zipcode = c("80230","33949"),   stringsAsFactors = FALSE)# Print a header.cat("# # # The Second data frame\n") # Print the data frame.print(new.address)# Combine rows form both the data frames.all.addresses <- rbind(addresses,new.address)# Print a header.cat("# # # The combined data frame\n") # Print the result.print(all.addresses)

当我们执行上面的代码时,它会产生以下结果 :

# # # # 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   zipcode1      Lowry      CO      802302      Charlotte  FL      33949# # # The combined data frame       city      state zipcode1      Tampa     FL    336022      Seattle   WA    981043      Hartford  CT     61614      Denver    CO    802945      Lowry     CO    802306     Charlotte  FL    33949

合并数据框

我们可以使用合并合并两个数据框( )功能.数据框必须具有相同的列名称才能进行合并.

在下面的示例中,我们认为Pima Indian Women中的糖尿病数据集可在库名称"MASS"中找到.我们基于血压("bp")和体重指数("bmi")的值合并两个数据集.在选择这两列进行合并时,这两个变量的值在两个数据集中匹配的记录被组合在一起形成一个数据框.

library(MASS)merged.Pima <- merge(x = Pima.te, y = Pima.tr,   by.x = c("bp", "bmi"),   by.y = c("bp", "bmi"))print(merged.Pima)nrow(merged.Pima)

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

   bp  bmi npreg.x glu.x skin.x ped.x age.x type.x npreg.y glu.y skin.y ped.y1  60 33.8       1   117     23 0.466    27     No       2   125     20 0.0882  64 29.7       2    75     24 0.370    33     No       2   100     23 0.3683  64 31.2       5   189     33 0.583    29    Yes       3   158     13 0.2954  64 33.2       4   117     27 0.230    24     No       1    96     27 0.2895  66 38.1       3   115     39 0.150    28     No       1   114     36 0.2896  68 38.5       2   100     25 0.324    26     No       7   129     49 0.4397  70 27.4       1   116     28 0.204    21     No       0   124     20 0.2548  70 33.1       4    91     32 0.446    22     No       9   123     44 0.3749  70 35.4       9   124     33 0.282    34     No       6   134     23 0.54210 72 25.6       1   157     21 0.123    24     No       4    99     17 0.29411 72 37.7       5    95     33 0.370    27     No       6   103     32 0.32412 74 25.9       9   134     33 0.460    81     No       8   126     38 0.16213 74 25.9       1    95     21 0.673    36     No       8   126     38 0.16214 78 27.6       5    88     30 0.258    37     No       6   125     31 0.56515 78 27.6      10   122     31 0.512    45     No       6   125     31 0.56516 78 39.4       2   112     50 0.175    24     No       4   112     40 0.23617 88 34.5       1   117     24 0.403    40    Yes       4   127     11 0.598   age.y type.y1     31     No2     21     No3     24     No4     21     No5     21     No6     43    Yes7     36    Yes8     40     No9     29    Yes10    28     No11    55     No12    39     No13    39     No14    49    Yes15    49    Yes16    38     No17    28     No[1] 17

融化和铸造

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

我们认为称为船舶的数据集存在于库名为"MASS".

library(MASS)print(ships)

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

     type year   period   service   incidents1     A   60     60        127         02     A   60     75         63         03     A   65     60       1095         34     A   65     75       1095         45     A   70     60       1512         6..........................8     A   75     75       2244         119     B   60     60      44882         3910    B   60     75      17176         2911    B   65     60      28609         58........................17    C   60     60      1179          118    C   60     75       552          119    C   65     60       781          0........................

融化数据

现在我们将数据融合以组织它,将除type和year之外的所有列转换为多行.

molten.ships <- melt(ships, id = c("type","year"))print(molten.ships)

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

      type year  variable  value1      A   60    period      602      A   60    period      753      A   65    period      604      A   65    period      75........................9      B   60    period      6010     B   60    period      7511     B   65    period      6012     B   65    period      7513     B   70    period      60......................41     A   60    service    12742     A   60    service     6343     A   65    service   1095......................70     D   70    service   120871     D   75    service      072     D   75    service   205173     E   60    service     4574     E   60    service      075     E   65    service    789......................101    C   70    incidents    6102    C   70    incidents    2103    C   75    incidents    0104    C   75    incidents    1105    D   60    incidents    0106    D   60    incidents    0......................

施放熔融数据

我们可以将熔融数据转换为新形式,其中每年创建每种类型船舶的总量.它是使用 cast()函数完成的.

recasted.ship <- cast(molten.ships, type+year~variable,sum)print(recasted.ship)

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

     type year  period  service  incidents1     A   60    135       190      02     A   65    135      2190      73     A   70    135      4865     244     A   75    135      2244     115     B   60    135     62058     686     B   65    135     48979    1117     B   70    135     20163     568     B   75    135      7117     189     C   60    135      1731      210    C   65    135      1457      111    C   70    135      2731      812    C   75    135       274      113    D   60    135       356      014    D   65    135       480      015    D   70    135      1557     1316    D   75    135      2051      417    E   60    135        45      018    E   65    135      1226     1419    E   70    135      3318     1720    E   75    135       542      1