Made by Mike_Zhang
所有文章:R学习1-基础 R学习2-I/O R学习3-Vector List Matrix R学习4-Data Frame R学习5-Graphics
从列数据对象构造。
若转换对象为向量或者变量: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 v31 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 col31 10 40 70 2 20 50 80 3 30 60 90
从行数据对象构造。
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 ) > dfrm <- rbind( dfrm, newRow) > dfrm col1 col2 col31 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 col31 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 ] col11 10 2 20 3 30 4 100 > dfrm[ c ( 1 , 3 ) ] col1 col31 10 70 2 20 80 3 30 90 4 100 300 > dfrm[ , 2 ] [ 1 ] 40 50 60 200 > dfrm[ , c ( 2 , 3 ) ] col2 col31 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 col31 10 40 70 2 20 50 80 3 30 60 90 4 100 200 300 > subset( dfrm, select= col1) col11 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 ) ) col12 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 col31 10 40 70 2 20 50 80 3 30 60 90 4 100 200 300 > colnames( dfrm) <- c ( "one" , "two" , "three" ) > dfrm one two three1 10 40 70 2 20 50 80 3 30 60 90 4 100 200 300
9 Data Frame Editing
不重写方法:
如下:
1 2 > temp <- edit( dfrm) > dfrm <- temp
此方法不会对原有数据产生影响,会返回一个修改过后的数据 。
会弹出修改界面:
R-edit()
重写方法:
此方法是对原有数据进行修改 ,不能撤回 !
会弹出修改界面:
R-fix()
10 NA Removing 移除data frame中的NA数据。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 > rbind( dfrm, c ( NA , NA , NA ) ) v1 v2 v31 10 40 70 2 20 50 80 3 30 60 90 4 NA NA NA > > na.omit( dfrm) v1 v2 v31 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 v21 10 40 2 20 50 3 30 60 > dfrm v1 v2 v31 10 40 70 2 20 50 80 3 30 60 90
可以一次排除多行:
1 2 3 4 5 > subset( dfrm, select= c ( - v1, - v3) ) v21 40 2 50 3 60
12 Data Frame Combination 12.1 Column Combination
1 2 3 4 5 6 7 8 9 10 11 12 13 14 > dfrm1 <- data.frame( "v4" = c ( 100 , 110 , 120 ) ) > dfrm1 v41 100 2 110 3 120 > dfrm3 <- cbind( dfrm, dfrm1) > dfrm3 v1 v2 v3 v41 10 40 70 100 2 20 50 80 110 3 30 60 90 120
12.2 Row Combination
1 2 3 4 5 6 7 8 9 > v1 <- c ( 200 , 200 , 200 , 200 ) > > dfrm4 <- rbind( dfrm3, v1) > dfrm4 v1 v2 v3 v41 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 v41 10 40 70 100 2 20 50 80 110 3 30 60 90 120 4 200 200 200 200 > > dfrm v1 v2 v31 10 40 70 2 20 50 80 3 30 60 90 > > merge( dfrm, dfrm) v1 v2 v31 10 40 70 2 20 50 80 3 30 60 90 > dfrm name v1 v21 A 40 70 2 B 50 80 3 C 60 90 > dfrm3 name v3 v4 v51 A 10 70 100 2 B 20 80 110 3 C 30 90 120 > merge( dfrm, dfrm3, by= "name" ) name v1 v2 v3 v4 v51 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 2 3 4 5 6 7 8 > dfrm name v1 v21 A 40 70 2 B 50 80 3 C 60 90 > with( dfrm, name) [ 1 ] "A" "B" "C"
2.持续访问:
添加名称到搜索列表,无需提及data frame的名称即可访问其内容。
使用detach()
方法从搜索列表中移除访问对象。
1 2 3 4 5 6 7 8 9 > attach( dfrm3) > name[ 1 ] "A" "B" "C" > search( ) [ 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 > name[ 1 ] 0 > dfrm3 name v3 v4 v5 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
感谢你的支持