dplyr:与group_by,mutate的R崩溃/错误

时间:2017-08-29 14:50:05

标签: r dplyr

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

谢谢,

0 个答案:

没有答案