楼主: kkiiuukkiiuu
11898 19

[问答] 请问怎么选出一行里面的最大值,并把数据每一行或列最大的值设为1,其他为0 [推广有奖]

11
jmpamao 发表于 2014-3-5 16:44:02
yywan0913 发表于 2014-3-5 16:40
我就知道data.table里面的fread比read.table快三倍。以及处理数据稍微好点。其他的感觉差不多的样子,可能 ...
https://bbs.pinggu.org/thread-2808708-1-1.html

这个例子 试了下  data.table 比julia的dataframe 要快点点。也是佩服data.table 的一点

12
xingzhaoh 发表于 2014-3-5 16:50:19
yywan0913 发表于 2014-3-4 13:32
好方法

13
yywan0913 在职认证  发表于 2014-3-5 17:01:24
jmpamao 发表于 2014-3-5 16:44
https://bbs.pinggu.org/thread-2808708-1-1.html

这个例子 试了下  data.table 比julia的dataframe 要 ...
赶脚那个跟data.table木关系的样子,by的效果。
data.table还是觉得适合读文件与生产数据框,以及处理些某些数据。其他时候我用的不多。
是什么给了你自信

14
wfldragon 发表于 2014-3-5 19:39:41
  1. require(data.table)
  2. DF = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9)
  3. DF[,z:=(y==max(y))*1]
复制代码
z就是了
研究需要我们共同努力!

15
jmpamao 发表于 2014-3-5 19:58:55
wfldragon 发表于 2014-3-5 19:39
z就是了
用LZ的数据,以row by row  最大值为1, 其他0 的 哑元。

16
nuomin 发表于 2014-3-5 20:08:33
jmpamao 发表于 2014-3-5 16:26
lz 从 COS看 数据量是也 有几万行

都要时间了。
你的写法精巧,我用了which.max函数想了一个其他的,和你的方法比较了下时间,得到了下面的结果。看来我的电脑是向着我的。
  1. > rm(list=ls())
  2. > ls()
  3. character(0)
  4. > gc()
  5.           used (Mb) gc trigger  (Mb)  max used   (Mb)
  6. Ncells  686224 36.7    2400785 128.3   2908849  155.4
  7. Vcells 9685080 73.9  117540763 896.8 141871202 1082.4
  8. > x <- matrix(rnorm(1000000*50),nrow=1000000)
  9. > timefunc1 <- function(x){
  10. +     t <- x*0
  11. +     sapply(1:nrow(x),function(z) t[z,which.max(x[z,])] <<- 1)
  12. +     return (t)
  13. + }
  14. >
  15. > timefunc2 <- function(x){
  16. +     out <- t(apply(x,1,function(x)x==max(x))+0)
  17. +     return (out)
  18. + }
  19. > system.time(out1 <- timefunc1(x))
  20.    user  system elapsed
  21.    6.44    0.06    6.50
  22. > system.time(out2 <- timefunc2(x))
  23.    user  system elapsed
  24.    8.16    0.28    8.44
  25. > system.time(out2 <- timefunc2(x))
  26.    user  system elapsed
  27.    7.05    0.21    7.27
  28. > system.time(out1 <- timefunc1(x))
  29.    user  system elapsed
  30.    6.19    0.06    6.26
  31. >
复制代码

17
jmpamao 发表于 2014-3-5 20:24:39
nuomin 发表于 2014-3-5 20:08
你的写法精巧,我用了which.max函数想了一个其他的,和你的方法比较了下时间,得到了下面的结果。看来我的 ...
是你的要快, 只要找到最大位置 就OK。
我这个先找到最大,再一个个比较

################
不过是想练练 data.table 怎么处理这类的问题。貌似没有 ROW BY ROW 的这种操作

18
wfldragon 发表于 2014-3-5 22:17:10
jmpamao 发表于 2014-3-5 20:24
是你的要快, 只要找到最大位置 就OK。
我这个先找到最大,再一个个比较
几列的话应该可以通过dplyr的命令搞定,不过没时间弄了。供参考
已有 1 人评分学术水平 收起 理由
jmpamao + 1 观点有启发

总评分: 学术水平 + 1   查看全部评分

研究需要我们共同努力!

19
ntsean 发表于 2014-3-5 22:56:50
我觉得没必要纠结太多再运行时间,如果真的要快,用Rcpp

library(Rcpp)
cppFunction("
     NumericMatrix convert(NumericMatrix input) {
             int n1 = input.nrow(), n2 = input.ncol();
             NumericMatrix result(n1, n2);
             for (int i = 0; i < n1; i++) {
                     double temp = input(i, 0);
                     int maxid = 0;
                     for (int j =0; j < n2; j++) {
                             if (input(i, j) > temp) {
                                     temp = input(i, j);
                                     maxid = j;
                             }
                     }
                     result(i, maxid) = 1;
             }
             return result;
     }
")

x <- matrix(rnorm(1000000*50),nrow=1000000)

system.time(y <- convert(x))

   user  system elapsed
  0.232   0.105   0.335
已有 1 人评分学术水平 收起 理由
jmpamao + 1 精彩帖子

总评分: 学术水平 + 1   查看全部评分

20
liwenxue_137 发表于 2014-3-25 15:45:42
一个sort就解决了
投入天翼决图u币上的人都

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

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