【发布时间】:2013-11-02 18:48:23
【问题描述】:
考虑下面的数据框。我想将每一行与下面的行进行比较,然后取大于 3 个值的行。
我写了下面的代码,但是如果你的数据框很大,它会很慢。
我怎样才能更快地做到这一点?
data <- as.data.frame(matrix(c(10,11,10,13,9,10,11,10,14,9,10,10,8,12,9,10,11,10,13,9,13,13,10,13,9), nrow=5, byrow=T))
rownames(data)<-c("sample_1","sample_2","sample_3","sample_4","sample_5")
>data
V1 V2 V3 V4 V5
sample_1 10 11 10 13 9
sample_2 10 11 10 14 9
sample_3 10 10 8 12 9
sample_4 10 11 10 13 9
sample_5 13 13 10 13 9
output <- data.frame(sample = NA, duplicate = NA, matches = NA)
dfrow <- 1
for(i in 1:nrow(data)) {
sample <- data[i, ]
for(j in (i+1):nrow(data)) if(i+1 <= nrow(data)) {
matches <- 0
for(V in 1:ncol(data)) {
if(data[j,V] == sample[,V]) {
matches <- matches + 1
}
}
if(matches > 3) {
duplicate <- data[j, ]
pair <- cbind(rownames(sample), rownames(duplicate), matches)
output[dfrow, ] <- pair
dfrow <- dfrow + 1
}
}
}
>output
sample duplicate matches
1 sample_1 sample_2 4
2 sample_1 sample_4 5
3 sample_2 sample_4 4
【问题讨论】:
-
您的真实数据集到底有多大?如果它不是很大,您可以将整个数据集与自身交叉连接并进行比较。此外,使用
data.table而不是data.frame将有助于记忆。 -
250,000 行 26 列
-
data.table不是对行不敏感的。 -
所以 n(n+1)/2 - n = 31249875000 个组合,每个 26 个比较。 。这可能很难做到并保留在内存中。如果您的输出附加到文件中可以吗?您可能需要使用类似
ff的包来处理这么大的数据集。 -
这是 Rcpp 的工作。但是,您应该仔细考虑为什么以及是否真的需要它。
标签: r