R 粘贴两列的元素
我有一个如下类型的data.frameR 粘贴两列的元素,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
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,谢谢。我觉得它也很快。我很难将所有答案的基准集在一起。