我有一个包含超过25万个值的向量(我知道,数量很大),我需要计算每个值之间的差异。因此,例如,对于第一个值202.7952,我想计算我的向量中的每个其他值与202.7952之间的差异,并限制它以便丢弃高于400的差异。然后,我希望它取第二个值(202.7956)并做同样的事情(包括上面的值)。我希望的最终结果是一个值列表,它是我向量中值的计算差异。例如: -
0.0004
0.0125
0.0136
etc
将通过从列表中接下来的三个值中获取第一个值的差异来生成,并且在执行相同的操作之前继续到底部,但是对于列表中的第二个值。但是,由于我的向量中有25万个值,我知道可能存在一些计算问题。我制作了一张图片来显示我的数据分布: -
我的值范围从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 :(得分: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函数来做这些事情并且不会产生内存问题。