Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 粘贴两列的元素_R_Performance_Dataframe_Paste_Rcpp - Fatal编程技术网

R 粘贴两列的元素

R 粘贴两列的元素,r,performance,dataframe,paste,rcpp,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

我有一个如下类型的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等。

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

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)
m试试:


m您提供的输出似乎与您提供的数据不符。这可能会造成一些混乱,因此可能需要更正
打印(输出)
的输出。根据您的描述,听起来您不希望
折叠
参数粘贴
sapply(seq(1,ncol(d),2),函数(x)粘贴0(d[,x],d[,x+1])
尽管它在函数中使用了全局变量……但您给出的输出似乎与您提供的数据不符。这可能会造成一些混乱,因此可能需要更正您描述中的
print(out)
输出,听起来您不希望
collapse
参数粘贴
sapply(seq(1,ncol(d),2),function(x)paste0(d[,x],d[,x+1])
,尽管它在函数中使用了全局变量…太棒了。很抱歉我的输出,我不知怎么更改了种子。您的输出是正确的。这似乎是使用R+1 Wesome可以找到的最有效的解决方案。很抱歉我的输出,我不知怎么更改了种子。您的输出是正确的。如果R+1都是个位数的话,这似乎是我们能找到的最有效的解决方案了。@Frank谢谢。我觉得它也很快。我很难将所有答案的基准集在一起。如果答案都是个位数,那就好了。@Frank,谢谢。我觉得它也很快。我很难将所有答案的基准集在一起。