R语言 如何转换数据
在这篇文章中,我们将学习如何在R编程语言中转换数据。
数据转换大多由R语言中的外部软件包 idyverse 和 dplyr 处理,这些软件包提供了许多方法来进行数据模拟。在R语言中,有大量的方法来模拟数据转换,这些方法广泛使用这些包,可以使用以下命令下载和安装。
install.packages("tidyverse")
方法1:使用Arrange()方法
R中的 arrange()方法 是用来为给定的观察值的序列创建一个顺序。它将单列或一组列作为该方法的输入,并为这些列创建一个顺序。
tidyverse包中的arrange()方法输入一列列名,以指定的顺序重新排列它们。默认情况下,arrange()方法将数据按升序排列。它的语法如下。
语法: arrange(col-name)
参数
col-name - 列的名称。
在应用arrange()方法后,可以用管道运算符提供数据框,以反映变化。
# Importing tidyvverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
l3 = c(0,1,1,1,0,0,0,0))
# Assigning row names
rownames(data_frame) <- c("r1",
"r2","r3","r4","r5","r6","r7","r8")
print("Data Frame")
print(data_frame)
# Arranging a single column in ascending order
arr_data_frame <- data_frame %>% arrange(col1)
print("Arranged Data Frame")
print(arr_data_frame)
输出
col1 col2 col3
r1 2 a 0
r2 4 b 1
r3 1 c 1
r4 7 d 1
r5 5 e 0
r6 3 f 0
r7 5 g 0
r8 8 h 0
[1] "Arranged Data Frame"
col1 col2 col3
r3 1 c 1
r1 2 a 0
r6 3 f 0
r2 4 b 1
r5 5 e 0
r7 5 g 0
r4 7 d 1
r8 8 h 0
解释:
数据框中所有的col1值都是按升序排列的,而行也相应地被洗牌。同样,我们可以使用arrange()方法中的desc()方法将数据按降序排列,数据框中的行也会相应地被洗牌,如下面的例子。
列值也可以按降序排列,方法是使用下面的语法明确指定顺序。
语法: arrange(desc(col-name))
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0))
# Assigning row names
rownames(data_frame) <- c("r1",
"r2","r3","r4","r5","r6","r7","r8")
print("Data Frame")
# Printing data frame
print(data_frame)
# Arranging column in descending order
arr_data_frame <- data_frame %>%
arrange(desc(col1))
print("Arranged Data Frame")
print(arr_data_frame)
输出
col1 col2 col3
r1 2 a 0
r2 4 b 1
r3 1 c 1
r4 7 d 1
r5 5 e 0
r6 3 f 0
r7 5 g 0
r8 8 h 0
[1] "Arranged Data Frame"
col1 col2 col3
r8 8 h 0
r4 7 d 1
r5 5 e 0
r7 5 g 0
r2 4 b 1
r6 3 f 0
r1 2 a 0
r3 1 c 1
方法2:使用select()方法
数据框架的特定列也可以通过tidyverse包中的 select()方法 来获取。这些列是按照它们在select()方法调用的参数列表中的说明顺序来获取的。该方法的输出结果是数据框架的一个子集。遵循以下语法。
语法: select(list-of-col-name)
参数
list-of-col-names – 用逗号分隔的列名列表。
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0),
col4 = c(9:16))
print("Data Frame")
# Printing data_frame
print(data_frame)
# Selecting a range of columns in df
arr_data_frame <- data_frame %>%
select(col2,col4)
print("Selecting col2 and col4 in Data Frame")
print(arr_data_frame)
输出
col1 col2 col3 col4
1 2 a 0 9
2 4 b 1 10
3 1 c 1 11
4 7 d 1 12
5 5 e 0 13
6 3 f 0 14
7 5 g 0 15
8 8 h 0 16
>
> # selecting a range of columns in df
> arr_data_frame <- data_frame %>% select(col2,col4)
> print("Selecting col2 and col4 in Data Frame")
[1] "Selecting col2 and col4 in Data Frame"
> print(arr_data_frame)
col2 col4
1 a 9
2 b 10
3 c 11
4 d 12
5 e 13
6 f 14
7 g 15
8 h 16
数据框的col2和col4被选中并显示为输出。
通过指定冒号操作符,也可以从数据框中提取连续的列的范围。例如,下面的代码片断表明,可以使用col2:col4命令来提取一个列的范围,该命令按顺序从数据框的col2开始提取所有的列。
由于在col2和col4之间有一个冒号操作符,数据框中的所有列都是按顺序从col2开始到col4结束的。因此,col2、col3和col4将作为输出数据框返回。
语法: select(begin-col : end-col)
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0),
col4 = c(9:16))
print("Data Frame")
print(data_frame)
# Selecting a range of columns
# in df
arr_data_frame <- data_frame %>%
select(col2:col4)
print("Selecting col2 to col4 in Data Frame")
print(arr_data_frame)
输出
col1 col2 col3 col4
1 2 a 0 9
2 4 b 1 10
3 1 c 1 11
4 7 d 1 12
5 5 e 0 13
6 3 f 0 14
7 5 g 0 15
8 8 h 0 16
[1] "Selecting col2 to col4 in Data Frame"
col2 col3 col4
1 a 0 9
2 b 1 10
3 c 1 11
4 d 1 12
5 e 0 13
6 f 0 14
7 g 0 15
8 h 0 16
方法3:使用filter()方法
tidyverse软件包中的 filter()方法 用于对数据框的列值应用一系列的约束和条件。它对数据进行过滤,结果是满足指定条件的列值返回较小的输出。条件是用逻辑运算符指定的,然后对数值进行验证。 一个数据框可以用管道运算符提供,然后使用过滤条件。
语法: filter(cond1, cond2)
参数
cond1, cond2 – 要应用于数据的条件。
下面的代码片段表明,所有col1值大于4的列值都被返回。在数据框的输出中只返回这些行。
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0),
col4 = c(9:16))
print("Data Frame")
# Printing data frame
print(data_frame)
# Selecting values where
# col1 value is greater than 4
arr_data_frame <- data_frame %>%
filter(col1>4)
print("Selecting col1 >4 ")
# Printing data frame after
# applying filter
print(arr_data_frame)
输出
col1 col2 col3 col4
1 2 a 0 9
2 4 b 1 10
3 1 c 1 11
4 7 d 1 12
5 5 e 0 13
6 3 f 0 14
7 5 g 0 15
8 8 h 0 16
[1] "Selecting col1 >4 "
col1 col2 col3 col4
1 7 d 1 12
2 5 e 0 13
3 5 g 0 15
4 8 h 0 16
解释:
输出数据框包含原始数据框中col1值大于4的行,这些行是按照它们在原始数据框中出现的顺序获取的。
也可以使用过滤器标签检查多个值。例如,要检查的值的范围是在 c()向量方法 中指定的 。 下面的代码片断说明了col3值被检查为 “there “或 “this “值。在数据框的最终输出中,满足这些平等约束中的任何一个的行被返回。
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c("this","that","there",
"here","there","this","that","here"),
col4 = c(9:16))
print("Data Frame")
# Printing data frame
print(data_frame)
# Selecting values where
# col1 value is greater than 4
arr_data_frame <- data_frame %>%
filter(col3 == c("there","this"))
print("Selecting col1>4 ")
# Printing data frame after
# applying filter
print(arr_data_frame)
输出
col1 col2 col3 col4
1 2 a this 9
2 4 b that 10
3 1 c there 11
4 7 d here 12
5 5 e there 13
6 3 f this 14
7 5 g that 15
8 8 h here 16
[1] "Selecting col3 value is either there or this"
col1 col2 col3 col4
1 1 c there 11
2 5 e there 13
3 3 f this 14
解释:
输出数据框包含原始数据框中col3值为 “this “或 “there “的行。这些行是按照它们在原始数据框中出现的顺序来获取的。
多个条件也可以在过滤器方法中检查,并使用逗号组合使用过滤器()方法。例如,下面的代码分别检查col3值是否等于 “there “和col1值是否等于5。输出的数据框包含原始数据框的行,其中col1的值相当于5,col3的值相当于 “there”。这些行是按照它们在原始数据框中出现的顺序来获取的。
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c("this","that","there","here",
"there","this","that","here"),
col4 = c(9:16))
print("Data Frame")
print(data_frame)
# Selecting values where
# col3 value is there and col1 is 5
arr_data_frame <- data_frame %>%
filter(col3=="there",col1==5)
print("Selecting col3 value
is there and col1 is 5")
print(arr_data_frame)
输出
col1 col2 col3 col4
1 2 a this 9
2 4 b that 10
3 1 c there 11
4 7 d here 12
5 5 e there 13
6 3 f this 14
7 5 g that 15
8 8 h here 16
[1] "Selecting col3 value is there and col1 is 5"
col1 col2 col3 col4
1 5 e there 13
方法4:使用spread()方法
R中的spread方法用于将任何键值对分散到数据框的多个列中。它被用来增加数据框中指定数据的可读性。数据根据spread()方法中的列列表被重新排列。col2中的所有数据被重复排列,直到col3中的值被用完。整个数据框作为输出被返回。它的语法如下:
语法: spread(col-name)
参数
col-name – 一个或多个列的名称,根据这些数据进行结构化。
下面的代码安排数据,使col2中的值被分配为列标题,其相应的值被分配为数据框的单元格值。
# Importing tidyr
library(tidyr)
# Creating a data frame
data_frame = data.frame(
col1 = c("A","A","A","A","A","A",
"B","B","B","B","B","B"),
col2 = c("Eng","Phy","Chem","MAQ","Bio","SST",
"Eng","Phy","Chem","MAQ","Bio","SST"),
col3 = c(34,56,46,23,72,67,89,43,88,45,78,99)
)
print("Data Frame")
print(data_frame)
# Selecting values by col2 and col3
arr_data_frame <- data_frame %>%
spread(col2,col3)
print("Spread using col2 and col3")
print(arr_data_frame)
输出
col1 col2 col3
1 A Eng 34
2 A Phy 56
3 A Chem 46
4 A MAQ 23
5 A Bio 72
6 A SST 67
7 B Eng 89
8 B Phy 43
9 B Chem 88
10 B MAQ 45
11 B Bio 78
12 B SST 99
[1] "Spread using col2 and col3"
col1 Bio Chem Eng MAQ Phy SST
1 A 72 46 34 23 56 67
2 B 78 88 89 45 43 99
解释:
数据框中的数据是用col2和col3的值分布的。col2的唯一值被分配为列标题,其相应的单元格值被分配为数据框值。
下面的代码安排数据,使col2中的值被分配为行标题,其相应的值被分配为数据框的单元格值。
# Importing tidyr
library(tidyr)
# Creating a data frame
data_frame = data.frame(
col1 = c("A","A","A","A","A","A",
"B","B","B","B","B","B"),
col2 = c("Eng","Phy","Chem","MAQ","Bio","SST",
"Eng","Phy","Chem","MAQ","Bio","SST"),
col3 = c(34,56,46,23,72,67,89,43,88,45,78,99)
)
print("Data Frame")
print(data_frame)
# Selecting values by col1 and col3
arr_data_frame <- data_frame %>%
spread(col1,col3)
print("Spread using col1 and col3")
print(arr_data_frame)
输出
col1 col2 col3
1 A Eng 34
2 A Phy 56
3 A Chem 46
4 A MAQ 23
5 A Bio 72
6 A SST 67
7 B Eng 89
8 B Phy 43
9 B Chem 88
10 B MAQ 45
11 B Bio 78
12 B SST 99
[1] "Spread using col1 and col3"
col2 A B
1 Bio 72 78
2 Chem 46 88
3 Eng 34 89
4 MAQ 23 45
5 Phy 56 43
6 SST 67 99
方法5:使用mutate()方法
R中的 mutate() 方法是用来在指定的数据框中创建和修改新的变量。一个新的列名可以被分配给数据框,并被评估为一个表达式,其中可以使用常数或列值。输出的数据框有新创建的列。该方法有以下语法。
语法: mutate (new-col-name = expr)
参数
- new-col-name – 要创建的列的名称。
- expr – 应用于新列的表达式。
多个列也可以被添加到数据框中,并使用逗号操作符分开。下面的代码片段说明了两个新列的添加,col5是col1和col4数值的总和,col6是常数1添加到col3的数值中。例如,在第一行中col1=2,col4=9,因此col5=2+9=11。而col6是col3值与1的相加。
# Importing tidyverse
library(tidyverse)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0),
col4 = c(9:16))
print("Data Frame")
print(data_frame)
# Added new columns
data_frame_mutate <- data_frame %>%
mutate(col5 = col1 + col4 ,
col6 = col3+1)
print("Mutated Data Frame")
print(data_frame_mutate)
输出
col1 col2 col3 col4
1 2 a 0 9
2 4 b 1 10
3 1 c 1 11
4 7 d 1 12
5 5 e 0 13
6 3 f 0 14
7 5 g 0 15
8 8 h 0 16
[1] "Mutated Data Frame"
col1 col2 col3 col4 col5 col6
1 2 a 0 9 11 1
2 4 b 1 10 14 2
3 1 c 1 11 12 2
4 7 d 1 12 19 2
5 5 e 0 13 18 1
6 3 f 0 14 17 1
7 5 g 0 15 20 1
8 8 h 0 16 24 1
方法6:使用group_by()和summaryise()方法
R中的 group_by() 和 summaryise() 方法被集体用来对数据框中的变量进行分组,并将多个值减少到一个单一的值。它的作用是使数据更易读。列名可以在R的group_by()方法中指定。数据可以被排列成组,然后使用本软件包中的基本聚合方法进一步汇总。
语法: group_by(col-name)
语法: group_by(col,.) %>% summarise(action)
数据框中的数据根据col3的值进行分组。计数列表示每组中的记录数;例如,有五行的col3=0,然后计算某个特定组中所有元素的平均值。
# Importing dplyr
library(dplyr)
# Creating a data frame
data_frame = data.frame(
col1 = c(2,4,1,7,5,3,5,8),
col2 = letters[1:8],
col3 = c(0,1,1,1,0,0,0,0),
col4 = c(9:16))
print("Data Frame")
print(data_frame)
# Mutate data using group_by()
# and summarise()
data_frame_mutate <- data_frame %>%
group_by(col3) %>%
summarise(
count = n(),
mean_col1 = mean(col1)
)
print("Mutated Data Frame")
print(data_frame_mutate)
输出
col1 col2 col3 col4
1 2 a 0 9
2 4 b 1 10
3 1 c 1 11
4 7 d 1 12
5 5 e 0 13
6 3 f 0 14
7 5 g 0 15
8 8 h 0 16
[1] "Mutated Data Frame"
# A tibble: 2 x 3
col3 count mean_col1
<dbl> <int> <dbl>
1 0 5 4.6
2 1 3 4
方法7:使用gather()方法
有时,许多数据列表示的值应该存储在数据框架的一个列中,而且是不必要的分叉。这可以用 gather() 方法来完成。它收集了键值对,并在新的列中重新排列。列值被指定为gather()方法的参数。例如,下面的代码片段说明了在gather()方法的参数2下,数据框的col2到col4的组合。从中选择数值的特定列被分配到被调用方法的参数1给出的列名 “主题 “下的标签。
语法: gather(data, key, value)
数据框中的col2、col3和col4的值在输出数据框中的 “Subject “列下被合在一起。然后,每个学生在每个科目中的分数被分配到col3值中。
# Importing dplyr
library(dplyr)
# Creating a data frame
data_frame = data.frame(col1 =
c("Jack","Jill","Yash","Mallika",
"Muskan","Keshav","Meenu","Sanjay"),
Maths = c(26,47,14,73,65,83,95,48),
Physics = c(24,53,45,88,68,35,78,24),
Chemistry = c(67,23,79,67,33,66,25,78)
)
print("Data Frame")
print(data_frame)
data_frame_mutate <- data_frame %>%
gather("Subject","Marks",2:4)
print("Mutated Data Frame")
# Printing after rearrange data
print(data_frame_mutate)
输出
col1 Maths Physics Chemistry
1 Jack 26 24 67
2 Jill 47 53 23
3 Yash 14 45 79
4 Mallika 73 88 67
5 Muskan 65 68 33
6 Keshav 83 35 66
7 Meenu 95 78 25
8 Sanjay 48 24 78
[1] "Mutated Data Frame"
col1 Subject Marks
1 Jack Maths 26
2 Jill Maths 47
3 Yash Maths 14
4 Mallika Maths 73
5 Muskan Maths 65
6 Keshav Maths 83
7 Meenu Maths 95
8 Sanjay Maths 48
9 Jack Physics 24
10 Jill Physics 53
11 Yash Physics 45
12 Mallika Physics 88
13 Muskan Physics 68
14 Keshav Physics 35
15 Meenu Physics 78
16 Sanjay Physics 24
17 Jack Chemistry 67
18 Jill Chemistry 23
19 Yash Chemistry 79
20 Mallika Chemistry 67
21 Muskan Chemistry 33
22 Keshav Chemistry 66
23 Meenu Chemistry 25
24 Sanjay Chemistry 78