粘贴两列

时间:2015-06-19 00:07:24

标签: r performance dataframe paste rcpp

我有一个以下类型的data.frame

set.seed(12)
d = data.frame(a=sample(5,x=1:9), 
               b=sample(5,x=1:9),
               c=sample(5,x=1:9),
               d=sample(5,x=1:9),
               e=sample(5,x=1:9),
               f=sample(5,x=1:9))

d
#   a b c d e f
# 1 1 1 4 4 2 3
# 2 7 2 7 9 7 5
# 3 8 5 3 8 1 2
# 4 2 9 8 7 5 9
# 5 9 6 2 1 9 4

我想取前两列,将整数转换为字符并将同一行的两个元素粘贴在一起。然后在每对连续的列中重复该过程。

这是一个可以正确完成工作的脚本:

bar = function (twocols) {sapply(1:nrow(twocols), FUN=function(x) {paste(twocols[x,], collapse="")} )}

    count = 0
    out = matrix(0, ncol=ncol(d)/2, nrow=nrow(d))
    for (i in seq(1,ncol(d), 2)) {
       count = count+1
       out[,count] = bar(d[,i:(i+1)])
    }

print(out)
     [,1] [,2] [,3]
[1,] "11" "44" "23"
[2,] "72" "79" "75"
[3,] "85" "38" "12"
[4,] "29" "87" "59"
[5,] "96" "21" "94"

但我的data.frame实际上非常大并且循环遍历整个data.frame中的R帧非常慢。你有更有效的解决方案吗? Rcpp可能是解决方案,但我不知道如何用C ++编写代码。

2 个答案:

答案 0 :(得分:6)

这符合您的描述,但不符合您显示的输出:

mat = as.matrix(d)

matrix(paste0(mat[, seq(1, ncol(mat), by = 2)],
              mat[, seq(2, ncol(mat), by = 2)]),
       ncol = ncol(mat) / 2)

#      [,1] [,2] [,3]
# [1,] "11" "44" "23"
# [2,] "72" "79" "75"
# [3,] "85" "38" "12"
# [4,] "29" "87" "59"
# [5,] "96" "21" "94"

当然,您可以将结果转换为数字,然后再转换为data.frame等。

答案 1 :(得分:2)

尝试:

m <- as.matrix(10*d[c(T,F)]+d[c(F,T)])
m[] <- as.character(m)