【发布时间】:2020-06-05 07:26:15
【问题描述】:
我正在处理一个包含超过 300 万个观测值的数据集。这个数据集包括超过 770,000 个我感兴趣的唯一 ID。数据包括有关这些 ID 的描述性信息。挑战在于这些唯一 ID 包含非唯一重复项,这意味着我需要找到一种方法来整合数据。
经过深思熟虑,我决定对数据集中的每个 ID 采取每列的模式。输出为每个 id 的每列提供了最常见的值。通过采用最常见的值,我可以将非唯一重复项合并到每个 id 的一行中。
问题:为此,我在 for 循环中迭代了超过 770,000 个唯一 ID。我想使用尽可能高效的代码,因为我一直在使用的 for 循环需要几天时间才能完成。
鉴于我提供的代码,有没有办法优化代码,使用并行处理,或者其他方式更有效地完成任务?
可重现的代码:
ID <- c(1,2,2,3,3,3)
x1 <- c("A", "B", "B","C", "C", "C")
x2 <- c("alpha", "bravo", "bravo", "charlie", "charlie2", "charlie2")
x3 <- c("apple", "banana", "banana", "plum1", "plum1", "plum")
df <- data.frame(ID, x1, x2, x3)
#Mode Function
getmode <- function(v) {
uniqv <- unique(v)
uniqv[which.max(tabulate(match(v, uniqv)))]
}
library(reshape2)
#Takes the mode for every column
mode_row <- function(dat){
x <- setNames(as.data.frame(apply(dat, 2, getmode)), c("value"))
x$variable <- rownames(x); rownames(x) <- NULL
mode_row <- reshape2::dcast(x, . ~ variable, value.var = "value")
mode_row$. <- NULL
return(mode_row)
}
#Take the mode of each row to account for duplicate donors
df2 <- NULL
for(i in unique(df$ID)){
df2 <- rbind(df2, mode_row(subset(df, ID == i)))
#message(i)
}
df2
预期输出:
ID x1 x2 x3
1 1 A alpha apple
2 2 B bravo banana
3 3 C charlie2 plum1
【问题讨论】:
-
我的直接反应是“不要使用
for循环”。使用分组处理(例如在 base R 或tidyverse中获得相同的结果。这将更加高效,并提供更紧凑和可读的代码。请发布您的预期输出。
标签: r for-loop optimization parallel-processing apply