Ошибка запуска cSplit при загрузке splitstackshape/data.frame и tidyr/dplyr

Пример файла данных (формат csv)

testdf <- read.csv("example.csv")

Я пытаюсь автоматизировать некоторый ростер-майнинг. В какой-то момент мне нужно разделить строки на основе имен с разделителями, поэтому cSplit из splitstackshape идеально подходит. Я также предшествую и следую за разделением с кучей формирования данных dplyr.

загруженные библиотеки:

library(data.table)
library(splitstackshape)
library(tidyr)
library(dplyr)

Проблема в том, что когда я загружаю dplyr после data.frame, я получаю следующее сообщение:

Attaching package: ‘dplyr’

The following objects are masked from ‘package:data.table’:

    between, last

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Затем, когда я пытаюсь использовать cSplit:

test <- cSplit(testdf, "Registrar", "/", direction = "long")

Я получаю эту ошибку:

Error in `[.tbl_df`(indt, , splitCols, with = FALSE) : 
  unused argument (with = FALSE)

Я пробовал различные перестановки - эта ошибка возникает только тогда, когда загружаются и data.frame, и dplyr (в любом порядке), а перезапуск R без dplyr или без его загрузки заставляет cSplit работать правильно.

Мне нужно иметь возможность использовать оба одновременно, и отсоединение dplyr не помогает (просто выдает отсутствующие ошибки dplyr).

Я видел эту тему, но они кажутся пришел к выводу, что данные повреждены. Это кажется вероятным, потому что, если я запускаю игрушечный набор данных,

Name <- "Bo / Ashley"
Date <- "2015-02-04"

testdf2 <- data.frame(Name, Date)

testtoy <- cSplit(testdf2, "Name", "/", direction = "long")

это работает нормально. Но я понятия не имею, как исправить эту "порчу".


person Luke_radio    schedule 24.08.2015    source источник
comment
Я получаю другую ошибку с набором данных Error in type.convert(unlist(x, use.names = FALSE)) : the first argument must be of mode character, хотя я использовал stringsAsFactors=FALSE в read.csv   -  person akrun    schedule 24.08.2015
comment
Для меня установка type.convert=FALSE сработала, но она также дает числовой индекс фактора вместо вектора символов. то есть test <- cSplit(testdf, "Registrar", "/", direction = "long", type.convert=FALSE). Я думаю, что ошибка, которую я получил, может быть связана с class выходного столбца. Если это factor, type.convert выдает эту ошибку.   -  person akrun    schedule 24.08.2015
comment
хм... теперь я чувствую, что мой пример не репрезентативен. Если я установлю stringsAsFactors = FALSE при импорте csv и удалю первый столбец (которого нет в моем основном наборе данных), тогда cSplit сработает. Это действительно сбивает с толку, потому что данные, которые я предоставил, являются только моими исходными данными, но они были перемещены через write.csv и read.csv.   -  person Luke_radio    schedule 24.08.2015
comment
Скорее всего, это потому, что вы пытаетесь использовать функцию на tbl_df, поддержку которой я не добавил.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 24.08.2015
comment
@Ананда О боже. Это все? Я только что попытался вернуться к стандартному data.frame, и это сработало. Это тот способ, которым вы бы рекомендовали работать с dplyr и splitstackshape одновременно (т. е. конвертировать все обратно в стандартный df перед использованием функций SSS)?   -  person Luke_radio    schedule 24.08.2015
comment
@LukeOR, я добавил это как проблему здесь. Однако на данный момент лучше всего добавить data.frame в цепочку обработки (если только вы не можете изменить функцию и создать запрос на вытягивание). Спасибо.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 24.08.2015
comment
@LukeOR, я добавил еще одно примечание в свой ответ. Возможно, было бы более подходящим добавить tbl_dt в ваш конвейер (и я, вероятно, смогу решить проблемы, добавив класс tbl_dt к моим функциям cSplit.   -  person A5C1D2H2I1M1N2O1R2T1    schedule 24.08.2015


Ответы (1)


Я не обновлял функции в "splitstackshape" для работы с tbl_df объектами. Таким образом, текущим обходным путем будет добавление data.frame в вашу цепочку.

Сравнивать:

library(splitstackshape)
library(dplyr)

CT <- tbl_df(head(concat.test))

CT %>% cSplit("Likes")
# Error in `[.tbl_df`(indt, , splitCols, with = FALSE) : 
#   unused argument (with = FALSE)

CT %>% data.frame %>% cSplit("Likes")
#      Name                   Siblings    Hates Likes_1 Likes_2 Likes_3 Likes_4 Likes_5
# 1:   Boyd Reynolds , Albert , Ortega     2;4;       1       2       4       5       6
# 2:  Rufus  Cohen , Bert , Montgomery 1;2;3;4;       1       2       4       5       6
# 3:   Dana                     Pierce       2;       1       2       4       5       6
# 4: Carole Colon , Michelle , Ballard     1;4;       1       2       4       5       6
# 5: Ramona           Snyder , Joann ,   1;2;3;       1       2       5       6      NA
# 6: Kelley          James , Roxanne ,     1;4;       1       2       5       6      NA

В качестве альтернативы, поскольку with = FALSE является аргументом для использования в "data.table", вы можете использовать tbl_dt вместо tbl_df объектов:

CT2 <- tbl_dt(head(concat.test))

CT2 %>% cSplit("Likes")
#      Name                   Siblings    Hates Likes_1 Likes_2 Likes_3 Likes_4 Likes_5
# 1:   Boyd Reynolds , Albert , Ortega     2;4;       1       2       4       5       6
# 2:  Rufus  Cohen , Bert , Montgomery 1;2;3;4;       1       2       4       5       6
# 3:   Dana                     Pierce       2;       1       2       4       5       6
# 4: Carole Colon , Michelle , Ballard     1;4;       1       2       4       5       6
# 5: Ramona           Snyder , Joann ,   1;2;3;       1       2       5       6      NA
# 6: Kelley          James , Roxanne ,     1;4;       1       2       5       6      NA

Конечно, если кто-то создаст запрос на включение, который решит проблему, я буду более чем счастлив внести соответствующие обновления :-)

person A5C1D2H2I1M1N2O1R2T1    schedule 24.08.2015