我有一个以下类型的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 ++编写代码。
答案 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)