计算向量中值之间的差异

时间:2015-03-13 11:32:37

标签: r difference

I'll我有一个包含超过25万个值的向量(我知道,数量很大),我需要计算每个值之间的差异。因此,例如,对于第一个值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);

                }

            }

        }


    }
}

由于

2 个答案:

答案 0 :(得分: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)))

注意NA的0。

答案 1 :(得分: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函数来做这些事情并且不会产生内存问题。