当双方报告关系时,我正在编写一个函数来删除公司之间无向关系的重复观察。对于我的~130万个观测数据集,下面的函数collapse_undirected
会导致在mutate
期间R崩溃或者出现错误:
“必须在CHARSXP上调用translateCharUTF8”
在mutate
期间进行复制。
此功能的目标是通过排序和连接其ID来唯一地标识每对相关公司,然后删除在同一时间段内报告的重复哈希值。
我使用的数据集已获得许可,因此我无法提供,但“translateCharUTF8”错误可以通过我在下面包含的随机生成的数据重现。对于较大的集合,它更频繁地发生。我会说约9000个观察结果。我还包含了一个无故障运行的慢速版本的函数,这进一步让我相信问题出现在第一个mutate
中。
带错误的函数:
collapse_undirected <- function(data, dir){
out <- data %>% filter(REL_TYPE != dir)
obs <- data %>% filter(REL_TYPE == dir) %>%
group_by(SOURCE, TARGET) %>%
mutate(hash = paste(min(SOURCE, TARGET),max(SOURCE, TARGET))) %>%
group_by(START, END) %>%
mutate(dup = duplicated(hash)) %>%
filter(!dup) %>%
select(-hash,-dup)
bind_rows(out,obs)
}
缓慢的解决方法:
jank_undir <- function(data, dir){
obs <- data %>% filter(REL_TYPE == dir)
out <- data %>% filter(REL_TYPE != dir)
obs$hash <- NA
for(i in 1:nrow(obs)){
obs$hash[i] <- paste(min(obs$SOURCE[i], obs$TARGET[i]),
max(obs$SOURCE[i], obs$TARGET[i]))
}
obs %>% group_by(START,END) %>%
mutate(dup = duplicated(hash)) %>%
filter(!dup) %>%
select(-hash,-dup) %>%
bind_rows(out)
}
这是一个随机生成测试数据的便利功能:
reroll <- function(n){
test_data <- data_frame(1:n)
test_data$SOURCE <- as.character(sample(1:27000, size = n, replace = TRUE))
test_data$TARGET <- as.character(sample(1:27000, size = n, replace = TRUE))
test_data$REL_TYPE <- "DUMMY"
test_data$START <- sample(1:2870, size = n, replace = TRUE)
test_data$END <- sample(1:2781, size = n, replace = TRUE)
test_data
}
而且随着随机抽签而变化,这应该证明错误:
library(dplyr)
test_data <- reroll(9000)
test_cleaned <- test_data %>% jank_undir("DUMMY")
test_cleaned <- test_data %>% collapse_undirected("DUMMY")
我非常感谢能够解释为什么会这样。慢版本现在足够快,但我预计需要将它用于更大的数据集。 R崩溃发生在基于主要数据集的基于Windows和Linux的R会话上,但在Linux版本上似乎不那么频繁。我的dplyr是0.7.2
谢谢,