R语言 数据框架的操作
数据框是一个由行和列组成的二维结构实体。它由等长的向量作为行。数据存储在单元格中,通过指定数据帧的相应[行,列]值集来访问。对数据框架的操作包括修改、提取和重组数据框架的内容。在这篇文章中,我们将学习有关在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的内置函数:names(data frame)[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
这里,第三列的标签从row3修改为3。这些变化被保留在原始数据库中。
示例 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改为2.这些变化被保留在原始数据库中。
扩展数据框
数据框架既可以进一步扩展以聚合更多的列,也可以收缩以删除列。
- 向数据框添加列
列,以向量的形式,可以使用数据框架的索引模式添加。新的列被附加在数据框的末尾。新列中的值甚至可以是两个现有列的组合,例如,两个列的加减。也可以追加一个由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被赋予一个向量0的值,并添加到数据框架的最后。然后创建第五列,用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(.列索引.)指定的。这里,第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
这里,所需的顺序被指定为列名。对原始数据框进行修改。