我有一个向量,它包含超过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);
}
}
}
}
}
谢谢
发布于 2015-03-13 04:05:19
下面是一个如何进行的示例。样本数据大小为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函数来做一些事情,这不会造成内存问题。
发布于 2015-03-13 03:47:07
向量是你在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))
若要通过向量累积值,需要使用累计和():
x <- rnorm(1000000)
x <- cumsum(c(0, diff(x)))
注意0英寸的NA。
https://stackoverflow.com/questions/29031146
复制