当双方报告关系时,我正在编写一个函数来删除公司之间无向关系的重复观察 . 对于我的~130万个观测数据集,下面的函数 collapse_undirected
导致在 mutate
期间的R崩溃或者错误: mutate
期间的错误:"translateCharUTF8 must be called on CHARSXP" .
此功能的目标是通过排序和连接其ID来唯一地标识每对相关公司,然后丢弃在同一时间段内报告的重复哈希值 .
数据集I 'm using is licensed so I can' t提供了它,但"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
谢谢,