楼主: yijiaobani
1989 3

[问答] R语言中data.table向量化计算问题 [推广有奖]

  • 4关注
  • 5粉丝

已卖:69份资源

博士生

26%

还不是VIP/贵宾

-

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

楼主
yijiaobani 发表于 2019-2-14 15:47:32 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
问题:
一个data.table格式,相对两列数据进行计算,得到一列新的数据,结果一直得不到理想的结果。想知道如何解决?

数据:
  1. n = 3
  2. ID = paste0("SNP",1:n)

  3. value = NULL
  4. for(i in 1:n){
  5.   value[i]= paste(sample(1:20,10),collapse = ";")
  6. }

  7. dd = data.frame(ID=ID,value=value)
  8. idA = rep(ID,n)
  9. idB = rep(ID,each=n)
  10. valueA = rep(value,n)
  11. valueB = rep(value,each=n)

  12. ddx = data.frame(idA=idA,idB=idB,valueA=as.character(valueA),valueB=as.character(valueB))
  13. ddy = as.data.table(ddx)

  14. ddy$valueA = as.character(ddy$valueA)
  15. ddy$valueB = as.character(ddy$valueB)
  16. ddy
复制代码
数据如下:
  1. > ddy
  2.     idA  idB                     valueA                     valueB
  3. 1: SNP1 SNP1  6;15;8;16;17;1;18;12;7;20  6;15;8;16;17;1;18;12;7;20
  4. 2: SNP2 SNP1  20;9;13;10;2;14;4;1;15;11  6;15;8;16;17;1;18;12;7;20
  5. 3: SNP3 SNP1 18;14;12;17;11;16;8;19;4;2  6;15;8;16;17;1;18;12;7;20
  6. 4: SNP1 SNP2  6;15;8;16;17;1;18;12;7;20  20;9;13;10;2;14;4;1;15;11
  7. 5: SNP2 SNP2  20;9;13;10;2;14;4;1;15;11  20;9;13;10;2;14;4;1;15;11
  8. 6: SNP3 SNP2 18;14;12;17;11;16;8;19;4;2  20;9;13;10;2;14;4;1;15;11
  9. 7: SNP1 SNP3  6;15;8;16;17;1;18;12;7;20 18;14;12;17;11;16;8;19;4;2
  10. 8: SNP2 SNP3  20;9;13;10;2;14;4;1;15;11 18;14;12;17;11;16;8;19;4;2
复制代码


想看以下valueA和valueB的交集的个数:
我的思路是,直接在data.table中生成一列V5,怀疑因为valueA和valueB涉及到分隔符计算,没有成功,我的代码:
  1. ddy[,V5:=length(intersect(strsplit(valueA,";"),strsplit(valueB,";")))]
  2. ddy
复制代码
结果V5都是3,是错误的:
  1. > ddy
  2.     idA  idB                     valueA                     valueB V5
  3. 1: SNP1 SNP1  6;15;8;16;17;1;18;12;7;20  6;15;8;16;17;1;18;12;7;20  3
  4. 2: SNP2 SNP1  20;9;13;10;2;14;4;1;15;11  6;15;8;16;17;1;18;12;7;20  3
  5. 3: SNP3 SNP1 18;14;12;17;11;16;8;19;4;2  6;15;8;16;17;1;18;12;7;20  3
  6. 4: SNP1 SNP2  6;15;8;16;17;1;18;12;7;20  20;9;13;10;2;14;4;1;15;11  3
  7. 5: SNP2 SNP2  20;9;13;10;2;14;4;1;15;11  20;9;13;10;2;14;4;1;15;11  3
  8. 6: SNP3 SNP2 18;14;12;17;11;16;8;19;4;2  20;9;13;10;2;14;4;1;15;11  3
  9. 7: SNP1 SNP3  6;15;8;16;17;1;18;12;7;20 18;14;12;17;11;16;8;19;4;2  3
  10. 8: SNP2 SNP3  20;9;13;10;2;14;4;1;15;11 18;14;12;17;11;16;8;19;4;2  3
  11. 9: SNP3 SNP3 18;14;12;17;11;16;8;19;4;2 18;14;12;17;11;16;8;19;4;2  3
复制代码

正确的做法,是写一个循环,但是数据量大的话,速度很慢:
  1. nn = dim(ddy)[1]
  2. re=NULL
  3. system.time({
  4.   for(i in 1:nn){
  5.     # i=3
  6.     re[i]= length(intersect(unlist(strsplit(ddy$valueA[i],";")),unlist(strsplit(ddy$valueB[i],";"))))
  7.   }
  8. })
  9. re
复制代码
结果:
  1. [1] 10  5  5  5 10  8  5  8 10
复制代码


我想使用apply解决,但是没有想到如何解决,十分感谢。



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Table 计算问题 ABLE Data tab 向量计算 apply

<img src="stati ...

沙发
yijiaobani 发表于 2019-2-14 15:49:00
人大经济论坛,里面使用代码格式, 也不能显示出$$$$$符号了。什么情况?

藤椅
yijiaobani 发表于 2019-2-15 09:21:18
  1. 在群里面问了大牛,给出解决方案如下:
  2. 使用大括号,新建变量a和b,然后比较a和b的交集数。
  3. ddy[,{a = strsplit(valueA,";")
  4. ;b = strsplit(valueB,";")
  5. ;.(c = sum(unlist(a) %in% unlist(b))) }
  6. ,by = id
  7. ]



  8. library(data.table)
  9. n = 3
  10. set.seed(123)
  11. ID = paste0("SNP",1:n)

  12. value = NULL
  13. for(i in 1:n){
  14.   value[i]= paste(sample(1:20,10),collapse = ";")
  15. }

  16. dd = data.frame(ID=ID,value=value)
  17. idA = rep(ID,n)
  18. idB = rep(ID,each=n)
  19. valueA = rep(value,n)
  20. valueB = rep(value,each=n)

  21. ddx = data.frame(idA=idA,idB=idB,valueA=valueA,valueB=valueB)
  22. ddy = data.table(idA=idA,idB=idB,valueA=valueA,valueB=valueB)
  23. ddy

  24. ddy$id <- 1:9


  25. ddy[,{a = strsplit(valueA,";")
  26. ;b = strsplit(valueB,";")
  27. ;.(c = sum(unlist(a) %in% unlist(b))) }
  28. ,by = id
  29. ]
  30. # id  c
  31. # 1:  1 10
  32. # 2:  2  3
  33. # 3:  3  5
  34. # 4:  4  3
  35. # 5:  5 10
  36. # 6:  6  4
  37. # 7:  7  5
  38. # 8:  8  4
  39. # 9:  9 10
复制代码

板凳
xiaoxin729 发表于 2019-2-15 13:40:32
这个是什么

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

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