结论: data.frame 产生的结果是数据帧,可以用$引用列。 当cbind引用的数据中没有数据帧时,其产生的结果是矩阵matrix,不能使用$引用; 当cbind引用的数据中有数据帧时,其产生的结果也是数据帧,但不会自动重命名重复的列名。 示例: 有如下3组基础变量(向量长度相同): > col1<-c(1,2,3,4,5,6,1,2,3,4,5,6) > col2<-c('a','b','c','a','b','c','a','b','c','a','b','c') > col3<-c('A','A','A','A','A','A','B','B','B','B','B','B') 分别使用data.frame与cbind构造新变量 > f1<-data.frame(col1,col2,col3) > f2<-cbind(col1,col2,col3) f1与f2结果看起来一样,如下图:
f1
f2
但实际上两者的类型不一样,f1是数据帧,而f2是矩阵。 > class(f1) [1]"data.frame" > class(f2) [1]"matrix" "array" 当cbind引用的参数中有数据帧时,其结果也为数据帧,如: > f3<-cbind(col1,f1) > class(f3) [1]"data.frame"
当cbind引用的参数中有数据帧且有重复列名时,cbind不会自动重命名列名,而data.frame会。 > f4<-data.frame(f1,f1) > f5<-cbind(f1,f1) f4与f5的结果对比如下,可以看到f4后3列的列名变了:
f5
f4
当引用的数据长度不一致时,data.frame和cbind均会报错。 如向量col4的长度为10,而向量col1的长度为12: > col4<-c(1,2,3,4,5,6,7,8,9,10) > f6<-data.frame(col1,col4) Error in data.frame(col1, col4) : 参数值意味着不同的行数: 12, 10 > f7<-cbind(col1,col4) Warning message: In cbind(col1, col4) : number of rows of result is not amultiple of vector length (arg 2) 不过data.frame可以传入固定值,如: > f8<-data.frame("idata8.com",as.character(col2[1]),col1) 其中idata8.com为固定值,as.character(col2[1])取向量col2的第一个值,也可以视为固定值,结果如下。
f8
|