计算向量中值之间的差异

Calculating differences between values in a vector

我有一个包含超过四分之一百万个值的向量(我知道,这是一个巨大的数量),我需要计算每个值之间的差异。因此,例如,对于第一个值 202.7952,我想计算我的向量中每个其他值与 202.7952 之间的差异并对其进行限制,以便丢弃超过 400 的差异。然后,我希望它采用第二个值 (202.7956) 并执行相同的操作(包括上面的值)。我希望最终结果是一个值列表,这些值是我的向量中值的计算差异。例如:-

0.0004
0.0125
0.0136
etc

将通过从列表中的下三个值中获取第一个值的差异来产生,并且在执行相同的操作之前继续到底部,但对于列表中的第二个值。但是,由于我的向量中有四分之一的百万个值,我知道可能存在一些计算问题。我制作了一张图片来显示我的数据分布:-

我的值在 200 到 1500 之间,绝大多数值都在 200-500 范围内。我曾尝试在 java 中执行此操作,但我 运行 遇到了内存问题,如果可以在 R 中执行此操作以及我如何执行此操作,你们中的任何人也是如此 think/know ?

这是我的 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);

                }

            }

        }


    }
}

谢谢

向量是您在 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 insted。

这是您可以如何继续的示例。大小为 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 函数来完成,并且不会产生内存问题。