📜  R – 数据帧操作

📅  最后修改于: 2022-05-13 01:54:18.930000             🧑  作者: Mango

R – 数据帧操作

数据框是由行和列组成的二维结构化实体。它由与行相同长度的向量组成。数据存储在单元格中,通过指定数据帧的相应 [row, col] 值集来访问这些单元格。数据帧的操作涉及修改、提取和重组数据帧的内容。在本文中,我们将研究与 R 中数据帧操作有关的各种操作。

重命名列

可以重命名数据框的列以将新名称设置为标签。但是,更改不会反映在原始数据框中。并非所有列都必须重命名。列标签可以设置为复数、数字或字符串值。重命名所有列所需的时间复杂度为 O(c),其中 c 是数据框中的列数。有两种方法可以重命名数据框中的列:

  • plyr包的rename()函数
    plyr包的 rename()函数根据旧名称修改列的名称。它不将列位置作为参数来重命名列标签。
    例子:
    # R program to rename a Data Frame
      
    # Adding Package
    df <- library(plyr)
      
    # Creating a Data Frame
    df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
    print("Original Data Frame")
    print(df)
    print("Modified Data Frame")
      
    # Renaming Data Frame
    rename(df, c("row1"="one", "row2"="two", "row3"="three"))
    

    输出:

    [1] "Original Data Frame"
      row1 row2 row3
    1    0    3    6
    2    1    4    7
    3    2    5    8
    [1] "Modified Data Frame"
      one two three
    1   0   3     6
    2   1   4     7
    3   2   5     8
     
    

    列标签已更改。在这种情况下,必须将结果分配回数据框,以保留更改。

  • R的内置函数:名称(数据框)[col]
    可以使用列索引或列名重命名列标签以设置新值。更改会反映在原始数据框中。 names()函数允许我们一次更改单个列的标签。

    示例 1:

    # R program to rename a Data Frame
      
    # Creating a Data Frame
    df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
    print("Original Data Frame")
    print(df)
    print("Modified Data Frame")
      
    # Renaming Data Frame
    names(df)[names(df)=="row3"]<-"three"
    print(df)
    

    输出:

    [1] "Original Data Frame"
      row1 row2 row3
    1    0    3    6
    2    1    4    7
    3    2    5    8
    [1] "Modified Data Frame"
      row1 row2 three
    1    0    3     6
    2    1    4     7
    3    2    5     8
     
    

    在这里,第三列的标签从第三行修改为第三。更改保留在原始数据库中。

    示例 2:

    # R program to rename a Data Frame
      
    # Creating a Data Frame
    df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
    print("Original Data Frame")
    print(df)
    print("Modified Data Frame")
      
    # Renaming Data Frame
    names(df)[2]<-"two"
    print(df)
    

    输出:

    [1] "Original Data Frame"
      row1 row2 row3
    1    0    3    6
    2    1    4    7
    3    2    5    8
    [1] "Modified Data Frame"
      row1 two row3
    1    0   3    6
    2    1   4    7
    3    2   5    8
    

    在这里,第二列标签从 row2 更改为两个。更改保留在原始数据库中。

扩展数据框

数据框既可以进一步扩展以聚合更多列,也可以收缩以删除列。

  • 向数据框中添加列
    可以使用数据框索引模式添加向量形式的列。新列附加在数据框的末尾。新列中的值甚至可以是两个现有列的组合,例如,两列的加法或减法。还可以附加由 NA 值组成的列。更改保留在原始数据框中。添加列所需的时间复杂度为 O(n),其中 n 是数据帧的行数。有多种方法可以添加新列。
    句法:
    dataframe[[newcol]] <- vector 
    or 
    dataframe[newcol] <-vector 
    or 
    dataframe$newcol <-vector 

    例子:

    # R program to add column in a Data Frame
      
    # Creating a Data Frame
    df<-data.frame(col1 = 0:2, col2 = 3:5, col3 = 6:8)
    print ("Original Data Frame")
    print (df)
      
    # Adding empty column
    df[["col4"]]<-0
      
    # assigns a value NA to the data frame column 5
    df$"col5"<-NA
      
    # Updating Values of column added
    df[["col5"]] <- df[["col1"]] + df[["col2"]]
    print ("Modified Data Frame")
    print (df)
    

    输出:

    [1] "Original Data Frame"
      col1 col2 col3
    1    0    3    6
    2    1    4    7
    3    2    5    8
    [1] "Modified Data Frame"
      col1 col2 col3 col4 col5
    1    0    3    6    0    3
    2    1    4    7    0    5
    3    2    5    8    0    7

    整个 col4 被分配一个向量零值,并首先添加到数据帧的末尾。然后创建使用 df$col5 访问的第五列,并分配值为 NA。然后将相应的值重新计算为第 1 列和第 2 列元素的总和。

  • 从数据框中删除列
    数据框的列可以通过它们的名称或索引值从数据框中删除。可以从数据框中一起删除多个列。可以将所需的列名或索引分配给 NULL 值,并相应地移动列。然后将列减少删除的数量。更改会反映在原始数据框中。

    示例 1:

    # R program to remove a column 
    # from a Data Frame
      
    # Creating a Data Frame
    df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
    print ("Original Data Frame")
    print (df)
      
    # Removing a Column
    df[["row2"]]<-NULL
    print(df)
    

    输出:

    [1] "Original Data Frame"
      row1 row2 row3
    1    0    3    6
    2    1    4    7
    3    2    5    8
      row1 row3
    1    0    6
    2    1    7
    3    2    8
     
    

    row2 从数据框中删除。列标签保持不变。 df[row2]<-NULL也会产生类似的结果。

    示例 2:通过列的整数索引删除列

    # R program to remove a column 
    # from a Data Frame
      
    # Creating a Data Frame
    df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8, row4 = rep(5))
    print ("Original Data Frame")
    print (df)
      
    # Removing two columns
    df <- df [-c(1, 3)]
    print(df)
    

    输出:

    [1] "Original Data Frame"
      row1 row2 row3 row4
    1    0    3    6    5
    2    1    4    7    5
    3    2    5    8    5
      row2 row4
    1    3    5
    2    4    5
    3    5    5
    

    要排除的列使用向量 -c(..column indices..) 指定。这里第 1 列和第 3 列已从数据框中删除,而更改仍保留在原始数据框中。

子集数据框

可以使用subset()函数,其中select 参数涉及要从数据框中删除的列名。也可以通过将它们转换为向量c(col1, col2) 来指定多个列名。此操作创建两个不相交的数据框集,一个包含排除列,另一个包含包含列。列数会因删除数而减少。更改确实反映在原始数据框中。
句法:

subset(dataframe, select= - column)

例子:

# R program to remove a column 
# from a Data Frame
  
# Creating a Data Frame
df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
print ("Original Data Frame")
print (df)
  
# Creating a Subset
df<-subset(df, select = - c(row1, row2))
print("Modified Data Frame")
print(df)

输出:

[1] "Original Data Frame"
  row1 row2 row3
1    0    3    6
2    1    4    7
3    2    5    8
[1] "Modified Data Frame"
  row3
1    6
2    7
3    8

在这里,row1 和 row2 都从数据框中删除。因此,该子集仅包含原始列集中的一列。

重新排序列

可以通过按所需顺序指定列名或列索引来重新排序数据框的列。原始数据框保持不变。必须重新分配更改以保留顺序。在最坏的情况下重新排序列所需的时间复杂度是 O(m*n),其中所有元素都必须移动到一个新位置,其中 m 是行数,n 是列数。

示例 1:

# R program to remove a column 
# from a Data Frame
  
# Creating a Data Frame
df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
print("Original Data Frame")
print(df)
print("Modified Data Frame")
  
# Temporary modifying column order
# in a Data Frame
df[,c(2, 1, 3)]

输出:

[1] "Original Data Frame"
  row1 row2 row3
1    0    3    6
2    1    4    7
3    2    5    8
[1] "Modified Data Frame"
  row2 row1 row3
1    3    0    6
2    4    1    7
3    5    2    8

在这里,所需的顺序被指定为列索引。因此,这些列被重新排序为列索引[2, 1, 3]。不会对原始数据框进行更改。

示例 2:

# R program to remove a column 
# from a Data Frame
  
# Creating a Data Frame
df<-data.frame(row1 = 0:2, row2 = 3:5, row3 = 6:8)
print("Original Data Frame")
print(df)
print("Modified Data Frame")
  
# Permanently modifying column order
# in a Data Frame
df <- df[c(2, 1, 3)]
print(df)

输出:

[1] "Original Data Frame"
  row1 row2 row3
1    0    3    6
2    1    4    7
3    2    5    8
[1] "Modified Data Frame"
  row2 row1 row3
1    3    0    6
2    4    1    7
3    5    2    8

在这里,所需的顺序被指定为列名。对原始数据框进行了更改。