►关于函数rbind()和cbind()
矩阵函数rbind()和cbind()也同样可以用于数据框,前提是两个数据框有相同的行数或者列数。例如,可以用cbind()向数据框中添加新的列,要求新的列与原有的列长度相同。用rbind()添加新行的时候,添加的行通常是数据框或者列表的形式。
> kids <- c( "Jack", "Jill" )
> ages <- c( 12, 10 )
> d <- data.frame( kids, ages, stringsAsFactors=FALSE )
> d
kids ages1
Jack 122
Jill 10
> rbind( d, list( "Laura", 19 ) )
kids ages1
Jack 122
Jill 103
Laura 19
►合并数据框
在关系型数据库的世界里,最重要的一个操作数合并,两张表根据某个变量的值组合到一起。相似的,R语言里两个数据框也可以用merge()函数合并在一起。
最简单的形式如下:merge( x,y )
假设数据框x和y有一个或多个同名的列,上面这条语句可以合并这两个数据框。例子如下:
> kids <- c( "Jack", "Jill", "john", "Lily" )
> states <- c( "CA", "MA", "MA", "HI" )
> d1 <- data.frame( kids, states, stringsAsFactors=FALSE )
> ages <- c( 12, 10, 18, 24 )
> kids <- c( "Jack", "Jillian", "john", "Lucy" )
> d2 <- data.frame( ages, kids, stringsAsFactors=FALSE )
> merge( d1, d2 )
kids states ages1
Jack CA 122
john MA 18
这两个数据框都有变量kids。R在两个数据框里查找kids变量值相同的行,再用查找到的行和两个数据框里所有列,创建新的数据框。
函数merge()有两个参数by.x和by.y,用于标示出两个数据框里含有相同信息但名称不同的两个变量。例子如下:
> kids <- c( "Jack", "Jill", "john", "Lily" )
> states <- c( "CA", "MA", "MA", "HI" )
> d1 <- data.frame( kids, states, stringsAsFactors=FALSE )
> ages <- c( 12, 10, 24 )
> pals <- c( "Jack", "Jillian", "Jill" )
> d3 <- data.frame( ages, pals, stringsAsFactors=FALSE )
> merge( d1, d3, by.x="kids", by.y="pals" )
kids states ages1
Jack CA 122
Jill MA 24
注:虽然在两个数据框里,两个变量一个名为kids,一个名为pals,但两个变量包含相同的信息,所以这样合并是有意义的。
重复匹配会在结果中全部出现,有时会得到错误的结果。
►在数据框上应用lapply()函数和sapply()函数
数据框是列表的特例,数据框的列构成了列表的组件。在数据框上应用lapply()函数,指定函数是f()。f()函数会作用域数据框的每一列,然后将返回值置于一个列表中。
> kids <- c( "Jack", "Jill", "john" )
> states <- c( "CA", "MA", "HI" )
> d <- data.frame( kids, states, stringsAsFactors=FALSE )
> lapply( d, sort )
$kids
[1] "Jack" "Jill" "john"
$states
[1] "CA" "HI" "MA"
注:结果是由两个向量构成的列表,这两个向量是排序后的kids和states。结果只是列表,而不是数据框,可以把它强制转化为数据框。
> as.data.frame( lapply( d, sort ) )
kids states1
Jack CA2
Jill HI3
john MA
注:该例子没有实际意义,已丢失了名字和住址的对应关系。