Мутировать столбец в отдельный фрейм данных, используя условие - PullRequest
0 голосов
/ 05 июля 2018

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

Возможно ли с помощью mutate добавить столбец во фрейм данных, отличный от того, который используется в канале?

Я пытался решить эту проблему с помощью советов, которые я нашел здесь: Объединить мутирование с условными значениями

Пример кода:

x <- "bbb"
y <- ""
end <- data.frame(a_col="aaa")

end <- x %>%
mutate (end, x_col = case_when(length()==0 ~ '-',
                         length()!=0 ~ .))

end <- y %>%
mutate (end, y_col = case_when(length()==0 ~ '-',
                         length()!=0 ~ .))

С обоими я получаю это: "Ошибка в UseMethod (" mutate_ "): нет применимого метода для 'mutate_', примененного к объекту класса "персонаж" "

Ожидаемый результат для фрейма данных 'end':

    a_col  x_col  y_col
1    aaa    bbb     -

1 Ответ

0 голосов
/ 05 июля 2018

Это то поведение, которое вы искали?

x <- "bbb"
y <- ""
end <- data.frame(a_col = "aaa")

end %>% mutate(x_col = case_when(nchar(x) == 0 ~ "-",
                                 TRUE ~ x),
               y_col = case_when(nchar(y) == 0 ~ "-",
                                 TRUE ~ y))

  a_col x_col y_col
1   aaa   bbb     -

Я думаю, что вы хотите использовать ?nchar() вместо ?length(), поэтому вам возвращается количество символов в строке вместо числа элементов в векторе.

Ошибка, которую вы получили, состояла в том, что вы пытались вызвать mutate(data = "bbb"), но mutate требует, чтобы аргумент data был data.frame или, по крайней мере, унаследовал свой класс от data.frame. Так что он пожаловался, когда вы пытались передать его character.

Это еще один способ захвата нескольких результатов конвейера в списке, и они выполняют подстановку пустой строки перед привязкой новых столбцов к существующему фрейму данных.

pipe_results <- list()

pipe_results[["x"]] <- x # these names become column names
pipe_results[["y"]] <- y

map_dfc(pipe_results,
        ~ gsub("^$", "-", .)) %>%
            bind_cols(end, .)
...