Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 带数据表和数据框的cbind_R_Dataframe_Data.table_Cbind - Fatal编程技术网

R 带数据表和数据框的cbind

R 带数据表和数据框的cbind,r,dataframe,data.table,cbind,R,Dataframe,Data.table,Cbind,我有一个关于数据表和数据帧中的cbind特性的问题。 如果绑定数据帧(df)和数据表(dt),那么结果对象的类取决于第一个参数 例如: > dt<-data.table(x=c(1,2,3),y=c(2,3,4),z=c(3,4,5)) > df<-data.frame(x=c(1,2,3),y=c(2,3,4),z=c(3,4,5)) > dt x y z 1: 1 2 3 2: 2 3 4 3: 3 4 5 >dt-df-dt x y z 1: 1 2

我有一个关于数据表和数据帧中的
cbind
特性的问题。 如果绑定数据帧(df)和数据表(dt),那么结果对象的类取决于第一个参数

例如:

> dt<-data.table(x=c(1,2,3),y=c(2,3,4),z=c(3,4,5))
> df<-data.frame(x=c(1,2,3),y=c(2,3,4),z=c(3,4,5))
> dt
   x y z
1: 1 2 3
2: 2 3 4
3: 3 4 5
>dt-df-dt
x y z
1: 1 2 3
2: 2 3 4
3: 3 4 5
案例1:(第一个参数作为数据帧)

>测试类(测试类)
[1] “数据帧”
案例2:(第一个参数作为数据表)

>test\u dtclass(test\u dt)
[1] data.table“data.frame”
因此,我的问题是,在两种不同的场景中,
cbind
没有data.table方法,如何才能将输出对象作为数据表和数据帧


很明显,在merge函数中,R根据第一个参数调用不同的合并函数(如果第一个参数是它调用的数据帧,则为数据帧,如果是数据表,则为merge的数据表方法)

cbind.data.frame
# function (..., deparse.level = 1) 
# {
#     if (!identical(class(..1), "data.frame")) 
#         for (x in list(...)) {
#             if (inherits(x, "data.table")) 
#                 return(data.table::data.table(...))
#         }
#     data.frame(..., check.names = FALSE)
# }
# <environment: namespace:base>
cbind.data.frame
#函数(…,deparse.level=1)
# {
#如果(!等同(类(…1),“data.frame”))
#对于(列表中的x(…)){
#if(继承(x,“data.table”))
#返回(data.table::data.table(…)
#         }
#data.frame(…,check.names=FALSE)
# }
# 

很奇怪,我同意-我本来希望有一个
cbind.data.table
方法,但我想有一些很好的理由不这么做。

试试
do.call(cbind,lappy(list(df,dt),setDT))
你总是可以直接调用方法。@RichardScriven是的,我们可以这样做,我只是想了解cbind在不同输入对象类别下的行为。解释如下:
>test_dt<-cbind(dt,df)
>class(test_dt)
[1] "data.table" "data.frame"
cbind.data.frame
# function (..., deparse.level = 1) 
# {
#     if (!identical(class(..1), "data.frame")) 
#         for (x in list(...)) {
#             if (inherits(x, "data.table")) 
#                 return(data.table::data.table(...))
#         }
#     data.frame(..., check.names = FALSE)
# }
# <environment: namespace:base>