快速粘贴具有特定范围的矩阵列

时间:2013-11-08 01:05:33

标签: r

我问过这个问题Pasting columns of matrix with a specific range in R 并提出了这种方法。

  g <- rep(1:2, each = 3)
  t(apply(a, 1, tapply, g, paste, collapse = " "))

不幸的是,这种方法太慢了,我正在寻找快速方式和更灵活的方式。

事实上,如果没有其他方法并将结果调用给R,我将把它作为C ++函数编写。

1 个答案:

答案 0 :(得分:1)

我一直在使用此功能粘贴数据框的列

pasteDFcol <- function(mydf,clmnnames=c("V1","V2"),sepChar=" "){
    do.call("paste",c(mydf[clmnnames],sep=sepChar))
}   

您可以使用as.data.frame传递矩阵,并指定要加入的列,例如

a=matrix(1:600000,ncol=600)
a1.df <- data.frame(V1=pasteDFcol(as.data.frame(a),clmnnames=paste0("V",1:300)),
              V2=pasteDFcol(as.data.frame(a),clmnnames=paste0("V",301:600)))
a2 <- as.matrix(a1.df)

它的速度是您使用的方法的两倍。

对于粘贴列1:4,5:8 ...或任何其他滚动框架,让我们修改函数以获取起始列,并将要粘贴的列数作为参数,然后使用sapply。< / p>

pasteDFcol <- function(clmStart, clmNum=4, mydf, sepChar=" "){
    do.call("paste",c(mydf[paste0("V",clmStart:(clmStart+clmNum-1))],sep=sepChar))
}
a=matrix(1:400,ncol=40)
pasteDFcol(clmStart=1, clmNum=4,mydf=as.data.frame(a))
a1 <- sapply(seq(1, 40, by=4), pasteDFcol, clmNum=4, mydf=as.data.frame(a))