Data.frame与cbind的区别

[复制链接]
51data 发表于 2020-9-17 17:18:11 | 显示全部楼层 |阅读模式
结论:
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

f1
     

f2

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

f5
  

f4

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

f8



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

51data

管理员

  • 主题20
  • 帖子20
  • 积分194
发布新帖 立即签到

最新主题

主题排行

快速回复 返回顶部 返回列表