我问过这个问题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 ++函数编写。
答案 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))