计算向量中值之间的差异
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 函数来完成,并且不会产生内存问题。
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 函数来完成,并且不会产生内存问题。