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
在这里,所需的顺序被指定为列名。对原始数据框进行了更改。