上一节:

  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 columns
    new.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   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 USA Women中糖尿病的数据集。我们根据血压(“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.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”的库中的称为ships的数据集。
     
    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 <- melt(ships, id = c("type","year"))
    print(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 <- cast(molten.ships, type+year~variable,sum)
    print(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
    
上一节: