楼主: yijiaobani
6933 4

[有偿编程] 数据框 每两列合并成一列 代码优化 [推广有奖]

  • 4关注
  • 5粉丝

已卖:69份资源

博士生

26%

还不是VIP/贵宾

-

威望
0
论坛币
191 个
通用积分
10.6711
学术水平
2 点
热心指数
8 点
信用等级
0 点
经验
5127 点
帖子
147
精华
0
在线时间
236 小时
注册时间
2015-5-18
最后登录
2020-10-28

楼主
yijiaobani 发表于 2018-8-3 17:09:03 |AI写论文
10论坛币
大家好,

我最近在学习apply系列的编程,书中介绍apply函数运行更快,可以代替for循环,我的问题:

geno为10行20列的数据框,我想将其变为10行10列,即第一列和第二列合并,第三列和第四列合并,以此类推。

geno:
  1. > geno
  2.       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
  3. [1,]    3    9    9    9    2    1    6    7    3     2     6     9     6     6     3     8     5     6     8     3
  4. [2,]    8    5    7    9    4    4    1    6    7     6     3     3     3     9     4     5     4     2     3     3
  5. [3,]    4    7    6    7    4    8    4    7    4     4     5     1     3     7     1     4     6     8     7     9
  6. [4,]    8    6    9    8    4    2    3    1    8     6     9     9     2     7     2     3     4     7     3     6
  7. [5,]    9    1    6    1    2    6    8    5    1     3     5     7     4     5     8     1     4     7     6     9
  8. [6,]    1    9    7    5    2    2    5    2    4     2     9     2     9     6     3     4     5     6     5     5
  9. [7,]    5    3    5    7    3    2    8    4    9     8     9     5     2     8     3     6     7     4     3     4
  10. [8,]    9    1    6    2    5    7    8    6    9     1     6     9     1     8     1     2     2     5     6     6
  11. [9,]    5    3    3    3    3    9    8    4    8     5     4     6     2     9     3     5     4     8     9     2
  12. [10,]    5    9    2    3    8    4    4    2    2     5     2     4     7     4     7     2     3     6     9     6
复制代码

想变为:
  1. > X
  2.       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
  3. [1,] "39" "99" "21" "67" "32" "69" "66" "38" "56" "83"
  4. [2,] "85" "79" "44" "16" "76" "33" "39" "45" "42" "33"
  5. [3,] "47" "67" "48" "47" "44" "51" "37" "14" "68" "79"
  6. [4,] "86" "98" "42" "31" "86" "99" "27" "23" "47" "36"
  7. [5,] "91" "61" "26" "85" "13" "57" "45" "81" "47" "69"
  8. [6,] "19" "75" "22" "52" "42" "92" "96" "34" "56" "55"
  9. [7,] "53" "57" "32" "84" "98" "95" "28" "36" "74" "34"
  10. [8,] "91" "62" "57" "86" "91" "69" "18" "12" "25" "66"
  11. [9,] "53" "33" "39" "84" "85" "46" "29" "35" "48" "92"
  12. [10,] "59" "23" "84" "42" "25" "24" "74" "72" "36" "96
复制代码




我低效的代码如下:

  1. set.seed(123)
  2. geno <- matrix(sample(x=c(1:9),size = 10*20,replace = T),10,20)
  3. geno

  4. hebing <- function(geno){
  5.   X <- matrix(0,dim(geno)[1],dim(geno)[2]/2)
  6.   
  7.   for(i in 1:dim(X)[2]){
  8.   X[,i] <- paste(geno[,c(2*i-1)],geno[,2*i],sep = "")
  9.   }
  10.   return(X)
  11. }

  12. result <- hebing(geno)
  13. result
复制代码


我的问题:

有没有更快的方法,比如我有300000列这样的数据,上面的代码就运行很慢,我想用apply或者更高效的方法。

十分感谢!



最佳答案

cheetahfly 查看完整内容

这既不是数据框问题,也不用apply来解决
关键词:数据框 apply函数 apply for循环 GENO apply 合并列
<img src="stati ...

沙发
cheetahfly 在职认证  发表于 2018-8-3 17:09:04
这既不是数据框问题,也不用apply来解决
  1. set.seed(123)
  2. geno <- matrix(sample(x = 1:9, size = 10*20, replace = T), 10, 20)
  3. dim(geno) <- c(10, 2, 10)
  4. geno <- matrix(paste0(geno[, 1, ], geno[, 2, ]), ncol = 10)
复制代码

藤椅
king64 发表于 2018-8-4 07:59:26
dim(z) <- c(10,2,10)
z <- apply(z,c(1,3),sum)

板凳
yijiaobani 发表于 2018-8-4 11:28:48
我将三种方法使用,结果显示第二种方法,运算速度更快,也证明了R语音中,自带的向量运算是最快的,十分感谢楼上的解答。

测试代码如下:
  1. set.seed(123)
  2. geno <- matrix(sample(x = 1:2, size = 1000*10000, replace = T), 1000, 10000)
  3. genox <- geno
  4. dim(geno)

  5. # methods1
  6. Time = proc.time()
  7. geno <- genox
  8. hebing <- function(geno){
  9.   X <- matrix(0,dim(geno)[1],dim(geno)[2]/2)
  10.   
  11.   for(i in 1:dim(X)[2]){
  12.     X[,i] <- paste(geno[,c(2*i-1)],geno[,2*i],sep = "")
  13.   }
  14.   return(X)
  15. }
  16. result <- hebing(geno)
  17. # result
  18. as.matrix(proc.time() - Time)

  19. # methods2
  20. Time = proc.time()
  21. geno <- genox
  22. Time = proc.time()
  23. dim(geno) <- c(dim(geno)[1], 2, dim(genox)[2]/2)
  24. result <- matrix(paste0(geno[, 1, ], geno[, 2, ]), ncol = dim(genox)[2]/2)
  25. # result
  26. as.matrix(proc.time() - Time)

  27. # methods3
  28. Time = proc.time()
  29. geno <- genox
  30. Time = proc.time()
  31. dim(geno) <- c(dim(geno)[1], 2, dim(geno)[2]/2)
  32. result <- apply(geno,c(1,3),sum)
  33. result <- dplyr::as_data_frame(result)
  34. # result
  35. as.matrix(proc.time() - Time)
复制代码


测试结果如下:
  1. # 第一种方法
  2.            [,1]
  3. user.self  5.45
  4. sys.self   0.13
  5. elapsed    5.62
  6. user.child   NA
  7. sys.child    NA

  8. # 第二种方法:
  9.            [,1]
  10. user.self  2.63
  11. sys.self   0.04
  12. elapsed    2.69
  13. user.child   NA
  14. sys.child    NA

  15. # 第三种方法:
  16.            [,1]
  17. user.self  9.64
  18. sys.self   0.09
  19. elapsed    9.73
  20. user.child   NA
  21. sys.child    NA
复制代码

报纸
yijiaobani 发表于 2018-8-4 11:29:16
十分感谢,完美解决了我的问题。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 02:39