R学习4-Data Frame

Made by Mike_Zhang


所有文章:
R学习1-基础
R学习2-I/O
R学习3-Vector List Matrix
R学习4-Data Frame
R学习5-Graphics


1 Creation form Column Data

从列数据对象构造。

若转换对象为向量或者变量:

1
> dfrm <- data.frame(v1,v2,v3)


若为List:
1
> dfrm <- as.data.frame(l1,l2,l3)

如下:

1
2
3
4
5
6
7
8
9
10
> v1 <- c(10,20,30)
> v2 <- c(40,50,60)
> v3 <- c(70,80,90)
>
> dfrm <- data.frame(v1,v2,v3)
> dfrm
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90

可添加列名:

1
2
3
4
5
6
> dfrm <- data.frame('col1'=v1,'col2'=v2,'col3'=v3)
> dfrm
col1 col2 col3
1 10 40 70
2 20 50 80
3 30 60 90


2 Creation form Row Data

从行数据对象构造。

1
> dfrm <- do.call(rbind,obs)

rbind方法:

1
2
3
4
5
6
7
8
9
> obs <- list(v1,v2,v3)
> rbind(obs[[1]])
[,1] [,2] [,3]
[1,] 10 20 30

> rbind(obs[[1]],obs[[2]])
[,1] [,2] [,3]
[1,] 10 20 30
[2,] 40 50 60

配合do.call方法:

1
2
3
4
5
> do.call(rbind,obs)
[,1] [,2] [,3]
[1,] 10 20 30
[2,] 40 50 60
[3,] 70 80 90

若处理对象为List,需要先把对象转换:

1
> dfrm <- do.call(rbind,Map(as.data.frame,obs))

3 Row Appending

首先需要构建一个行data frame,再把它添加到原有的data frame中去:

1
2
3
4
5
6
7
8
9
> newRow <- data.frame(col1=100,col2=200,col3=300) # new row creation

> dfrm <- rbind(dfrm,newRow) # appending
> dfrm
col1 col2 col3
1 10 40 70
2 20 50 80
3 30 60 90
4 100 200 300

也可以合在一起:

1
> dfrm <- rbind(dfrm, data.frame(col1=100,col2=200,col3=300))

4 Preallocation

R可以预先分配Data Frame的结构。

1
2
3
4
5
6
7
8
9
> x <- 5
> df <- data.frame(col1=numeric(x),col2=character(x),col3=numeric(x))
> df
col1 col2 col3
1 0 0
2 0 0
3 0 0
4 0 0
5 0 0

5 Column Selection by Position

dfrm[[n]]:选择第n列,并返回一个向量。

dfrm[c(n1,n2,n3,...)]:返回指定几列,返回一个data frame。

dfrm[n]:上述方法的特例,选择第n列,返回一个data frame。

dfrm[, n]:选择第n列,并返回一个向量。

dfrm[, c(n1,n2,n3,...)]:返回指定几列,返回一个data frame

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
> dfrm[[1]]
[1] 10 20 30 100

> dfrm[1]
col1
1 10
2 20
3 30
4 100

> dfrm[c(1,3)]
col1 col3
1 10 70
2 20 80
3 30 90
4 100 300

> dfrm[,2]
[1] 40 50 60 200

> dfrm[,c(2,3)]
col2 col3
1 40 70
2 50 80
3 60 90
4 200 300

6 Column Selection by Name

与上一节类似。

dfrm[["name"]],dfrm$name:选择name列,并返回一个向量。

dfrm[c("name1","name2","name3",...)]:返回指定几列,返回一个data frame。

dfrm["name"]:上述方法的特例,选择name列,返回一个data frame。

dfrm[, "name"]:选择name列,并返回一个向量。

dfrm[, c("name1","name2","name3",...)]:返回指定几列,返回一个data frame。


7 Column & Row Selection

使用subset()方法。

7.1 Row Selection

设置select参数。

1
2
> subset(dfrm, select=colName)
> subset(dfrm, select=c(n1,n2,n3,...))

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
> dfrm
col1 col2 col3
1 10 40 70
2 20 50 80
3 30 60 90
4 100 200 300

> subset(dfrm, select=col1)
col1
1 10
2 20
3 30
4 100

7.2 Column Selection

设置subset参数,为逻辑表达式

1
> subset(dfrm, subset=(x>0))

如下:

1
2
3
4
5
> subset(dfrm, select=col1,subset=(col1>10))
col1
2 20
3 30
4 100

此方法一般与上一节方法一起使用。


8 Column Name Changing

1
> colnames(dfrm) <- newNames

如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> dfrm
col1 col2 col3
1 10 40 70
2 20 50 80
3 30 60 90
4 100 200 300

> colnames(dfrm) <- c("one","two","three")
> dfrm
one two three
1 10 40 70
2 20 50 80
3 30 60 90
4 100 200 300

9 Data Frame Editing

  1. 不重写方法:
1
edit(dfrm)

如下:

1
2
> temp <- edit(dfrm)
> dfrm <- temp

此方法不会对原有数据产生影响,会返回一个修改过后的数据

会弹出修改界面:


R-edit()

  1. 重写方法:
1
fix(dfrm)

此方法是对原有数据进行修改不能撤回

会弹出修改界面:


R-fix()

10 NA Removing

移除data frame中的NA数据。

1
> na.omit(dfrm)

如下:

1
2
3
4
5
6
7
8
9
10
11
12
> rbind(dfrm,c(NA,NA,NA))
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90
4 NA NA NA
>
> na.omit(dfrm)
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90

11 Column Excluding by Name

1
subset(dfrm,select = -colName)

使用负号列名排除一列或几列数据,并返回data frame,不会对原数据有影响,如下:

1
2
3
4
5
6
7
8
9
10
11
> subset(dfrm,select=-v3)
v1 v2
1 10 40
2 20 50
3 30 60

> dfrm
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90

可以一次排除多行:

1
2
3
4
5
> subset(dfrm,select=c(-v1,-v3))
v2
1 40
2 50
3 60

12 Data Frame Combination

12.1 Column Combination

1
> cbind(dfrm1,dfrm2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
> dfrm1 <- data.frame("v4"=c(100,110,120))
> dfrm1
v4
1 100
2 110
3 120

> dfrm3 <- cbind(dfrm,dfrm1)

> dfrm3
v1 v2 v3 v4
1 10 40 70 100
2 20 50 80 110
3 30 60 90 120

12.2 Row Combination

1
> rbind(dfrm1,dfrm2)
1
2
3
4
5
6
7
8
9
> v1 <- c(200,200,200,200)
>
> dfrm4 <- rbind(dfrm3,v1)
> dfrm4
v1 v2 v3 v4
1 10 40 70 100
2 20 50 80 110
3 30 60 90 120
4 200 200 200 200

13 Data Frame Merging

基于相同的列名,或给予给定的列名,合并两个data frame,并返回。

1
> mf <- merge(d1,d2,by="mergeName")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
> dfrm4
v1 v2 v3 v4
1 10 40 70 100
2 20 50 80 110
3 30 60 90 120
4 200 200 200 200
>
> dfrm
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90
>
> merge(dfrm,dfrm)
v1 v2 v3
1 10 40 70
2 20 50 80
3 30 60 90

> dfrm
name v1 v2
1 A 40 70
2 B 50 80
3 C 60 90

> dfrm3
name v3 v4 v5
1 A 10 70 100
2 B 20 80 110
3 C 30 90 120

> merge(dfrm,dfrm3,by="name") # given merge name
name v1 v2 v3 v4 v5
1 A 40 70 10 70 100
2 B 50 80 20 80 110
3 C 60 90 30 90 120

14 Data Frame Accessing

1.快速访问:

1
with(dfrm,colName)
1
2
3
4
5
6
7
8
> dfrm
name v1 v2
1 A 40 70
2 B 50 80
3 C 60 90

> with(dfrm,name)
[1] "A" "B" "C"

2.持续访问:

1
attach(dfrm)

添加名称到搜索列表,无需提及data frame的名称即可访问其内容。

使用detach()方法从搜索列表中移除访问对象。

1
2
3
4
5
6
7
8
9
> attach(dfrm3)
> name
[1] "A" "B" "C"

> search() # to show the search list
[1] ".GlobalEnv" "dfrm3" "dfrm"
[4] "package:stats" "package:graphics" "package:grDevices"
[7] "package:utils" "package:datasets" "package:methods"
[10] "Autoloads" "package:base"

attach()方法只是对数据的暂时拷贝,修改拷贝的数据不会对原数据有影响。因为只是在工作区创建了一个同名的本地变量,不会对原变量产生影响:

1
2
3
4
5
6
7
8
9
10
> name
[1] "A" "B" "C"
> name <- 0 # edit to the copied data
> name
[1] 0 # changed
> dfrm3
name v3 v4 v5 # no change
1 A 10 70 100
2 B 20 80 110
3 C 30 90 120

参考

P. Teetor, R Cookbook. Sebastopol: O’Reilly Media, Incorporated, 2011.


写在最后

R语言相关的知识会继续学习,继续更新.
最后,希望大家一起交流,分享,指出问题,谢谢!


原创文章,转载请标明出处
Made by Mike_Zhang




感谢你的支持

R学习4-Data Frame
https://ultrafish.io/post/R-learning-4/
Author
Mike_Zhang
Posted on
December 22, 2021
Licensed under