粘贴两列的元素

Paste the elements of two columns

我有一个 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 实际上非常大,在 R 中遍历整个 data.frame 非常慢。你有更有效的解决方案吗? Rcpp 可能是解决方案,但我不知道如何用 C++ 编写代码。

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

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,等等。

尝试:

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