当双方报告关系时,我正在编写一个函数来删除公司之间无向关系的重复观察 . 对于我的~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

谢谢,