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

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

Возможно ли с помощью 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_ ", примененного к объекту класса" персонаж ""

Ожидаемый результат для "конечного" фрейма данных:

    a_col  x_col  y_col
1    aaa    bbb     -

1 ответ

Решение

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

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, .)
Другие вопросы по тегам