2015-03-13 30 views
1

I'll我有一个向量包含刚刚超过四分之一百万的值(我知道,数额巨大),我需要计算每个值之间的差异。因此,例如,在第一个值为202.7952的情况下,我想计算向量中每个其他值与202.7952之间的差异,并限制它,以便丢弃高于400的差异。然后,我希望它取第二个值(202.7956)并做同样的事情(包括上面的值)。这个我希望的最终结果将是我的向量中值的计算差异值的列表。例如: -计算向量中的值之间的差异

0.0004 
0.0125 
0.0136 
etc 

会从该列表中的后三个值取差值为第一价值,而且它做同样的事情之前,但在第二个值继续到下产生名单。但是,因为我的矢量中有25万个值,所以我知道可能存在一些计算问题。我已经产生的图像显示我的数据的分布: -

enter image description here

我从200至1500范围内,绝大多数落在200-500范围内的值的值。我试图用java做这件事,但是我遇到了内存问题,所以你们有没有想过/知道是否可以在R中做到这一点,以及我可以怎么做呢?

这是我的Java代码: -

public class matrixDiff { 

    public static void main(String[] args) throws IOException{ 

     double[] values = new double[271730];      

     BufferedReader br = new BufferedReader(new FileReader("file")); 

     String value = br.readLine(); 

     for(int i = 0; i < values.length; i++){ 

      if(value != null){ 

       values[i] = Double.parseDouble(value); 
      } 

      value = br.readLine(); 

     } 

     for(int i = 0; i < values.length; i++){ 

      double mzValue = values[i]; 

      System.out.println(mzValue); 

      for(int j = 0; j < values.length; j++){ 

       double diff = values[j]; 


       if((diff - mzValue) < 400 || (diff - mzValue) > -400){ 

        System.out.println(diff - mzValue); 

       } 

      } 

     } 


    } 
} 

感谢

+0

你绝对可以在R中做到这一点,但你也可以在Java中做到这一点。如果您已经了解了Java的基础知识,那么我会花一些时间学习如何优化代码,而不是仅仅为了这个非常专业的目的而学习一门新的语言。 – 2015-03-13 11:38:02

+0

可能是一个好主意,找出有多少值超过400,然后去选择一种方法。向量可能会变小很多,而250k对于R来说并不是真正的问题 – 2015-03-13 11:40:02

+0

只是好奇,下一步你需要做什么? – 2015-03-13 11:43:15

回答

2

下面是一个如何继续下去的例子。大小的样本数据1000

memory.limit(max = NA) 
# filter out differences larger than K 
K = 25 

v <- rnorm(n = 1000, mean = 200, sd = 10) 
diffs <- list() 
for(i in seq_along(v)) { 
    diffs[[i]] <- v[i] - v 
    diffs[[i]] <- diffs[[i]][diffs[[i]] <= K] 
} 


# Check lengths after filtering 
sapply(diffs, length) 

编辑

我不知道,如果你认为它,或者如果你已经解决了你的问题,但处理数据的量,有一两件事你可以做它将所有内容存储在数据库中。例如:

library(RSQLite) 
con <- dbConnect(SQLite(), "diffs.sqlite") 
memory.size(max = NA) 
v <- rnorm(n = 100000, mean = 200, sd = 10) 

# filter out differences larger than K 
K = 25 

for(i in seq_along(v)) { 
    diffs <- v[i] - v 
    diffs <- diffs[diffs <= K] 
    dbWriteTable(con, "mytable", as.data.frame(diffs), append=TRUE) 
} 

然后有东西,你可以做使用SQL,而不是R里面的函数,并且不会造成内存问题。

+0

我刚刚意识到,对于更大的样本量,我也遇到了内存问题。将尝试去想些什么... – 2015-03-13 12:11:54

+0

哈哈是啊,这是这个问题的ballache,但谢谢你! – user2062207 2015-03-13 12:13:17

+0

我已经设法限制我的数据,现在只有58000个值,所以我现在试着看看它是否有效 – user2062207 2015-03-13 12:48:13

2

向量位于R.大量的时间和内存节省您的朋友。

数据帧例如:

df <- data.frame(x = rnorm(1000000)) 
df$dif <- df$x - c(NA, df$x[1:(length(df$x)-1)]) 

你去那里,在眨眼间1KK数字差异。

向量例如:

x <- rnorm(1000000) 
x <- c(NA, x[1:(length(x)-1)]) 

或者更短:

x <- rnorm(1000000) 
x <- c(NA, diff(x)) 

要通过矢量累积值,你需要cumsum():

x <- rnorm(1000000) 
x <- cumsum(c(0, diff(x))) 

注意0 insted的的NA。

+0

谢谢!我刚刚用我的数据尝试过,所以我这样做: - 'maldi $ dif < - maldi $ x -c(NA,maldi $ x [1:(length(df $ x)-1)])'but I得到以下消息: - 'maldi $ x:$运算符中的错误对于原子向量无效' – user2062207 2015-03-13 11:53:23

+0

woops对不起,我输入了错误信息,这就是我所做的: - '> maldi $ dif < - maldi $ x - c (NA,maldi $ x [1:(length(maldi $ x)-1)]) maldi $ x:$运算符中的错误对于原子向量无效' 可能是这种情况:'df < - data.frame (x = rnorm(1000000))'作为一个数据框出来,因为它对于is.data.frame是真的,而且我的maldi对象不是? – user2062207 2015-03-13 11:57:16

+1

为什么不只是'c(NA,diff(df $ x))'?你在这里重新发明轮子。 – 2015-03-13 11:57:57

相关问题