Использование отдельно в tidyr r на основе условного использования ifelse - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь разделить столбец на несколько столбцов с помощью tidyr. Сначала я попробовал использовать if..else, и это не сработало, и когда я посмотрел на stackoverflow, я предложил использовать ifelse. Итак, я попытался использовать ifelse, но он все еще не работает. Вот что я пытаюсь сделать, когда получаю сообщение об ошибке:

testdata <- tibble::tribble(
  ~config,       ~construct, ~var,
  1, "This_is_line_1",   12,
  2, "This_is_dot_2",   15,
  3, "This_is_dot_1 ",   15,
  4, "This_is_line_2",   12,
  5, "This_is_line_3",   12,
  6, "This_is_dot_4",   15,
  7, "This_is_dot_3 ",   15,
  8, "This_is_line_4",   12
)


  ifelse(testdata$var == 12,
         tidyr::separate(testdata$construct, into = c("etc1","etc2", "etc3","etc4"), sep = "_", remove = FALSE),
         tidyr::separate(testdata$construct, into = c("etc1","etc2", "etc5","etc4"), sep = "_", remove = FALSE)
         )

Сообщение об ошибке: Error in UseMethod("separate_") : no applicable method for 'separate_' applied to an object of class "character"

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Мы также могли бы сначала сделать separate, а затем изменить имена столбцов на rename

library(dplyr)
library(tidyr)
library(stringr)
library(purrr)
testdata %>%
   separate(construct, into = str_c("etc", 1:4), sep="_", remove = FALSE) %>% 
   group_split(grp = var == 12) %>%
   map_dfr(~  if(!first(.x$grp)) .x %>% 
         rename(etc5 = etc3) else .x) %>% 
   select(-grp)
1 голос
/ 14 июля 2020

Простой оператор ifelse не подходит для возврата данных различной формы. Вот другая стратегия, которая разделяет данные, затем выполняет условное преобразование, а затем объединяет все вместе

testdata %>% 
  group_split(is12 = var==12) %>% 
  map(function(d) {
    into = if (d$is12[1]) {
      c("etc1","etc2", "etc3","etc4")
    } else {
      c("etc1","etc2", "etc5","etc4")
    }
    tidyr::separate(d, construct, into = into, sep = "_", remove = FALSE)
  }) %>% 
  bind_rows() %>% select(-is12)
...