Отделить, чтобы разделить один столбец на несколько

#r

#r

Вопрос:

Я хочу разделить ID столбец на 3 столбца (называемые «A», «B», «C») на основе строковых индексов. Первый столбец должен сообщать только о элементе 1, вторые элементы 2:3 , последний столбец 4: 7.

     ID     Data
mw21e10     878         
mw61e10     908          
mw61e10    1073  
  

Я определил векторы с желаемыми позициями строк, как показано ниже

 a <- c(1,2,4)
b <- c(1,3,7)
  

Я пытаюсь использовать определенные векторы в отдельной функции

 df<-mydata %>%
  separate(code, c("A", "B", "C"), c(c(1,2,4), c(1,3,7))))


 
  

Ответ №1:

Мы можем использовать substring на основе вектора ‘a’, ‘b’, а затем использовать unnest_wider для изменения list столбца на три столбца

 library(dplyr)
library(tidyr)
mydata %>%
   rowwise %>% 
   mutate(new = list(substring(ID, a, b))) %>%
   ungroup %>% 
   unnest_wider(c(new), names_repair = ~c(names(mydata), 'A', 'B', 'C'))
  

-вывод

 # A tibble: 3 x 5
#  ID       Data A     B     C    
#  <chr>   <int> <chr> <chr> <chr>
#1 mw21e10   878 m     w2    1e10 
#2 mw61e10   908 m     w6    1e10 
#3 mw61e10  1073 m     w6    1e10 
  

Или, если нам нужно использовать separate , убедитесь, что указано только положение разделения, а не диапазон из двух векторов. Исходя из выходных substr данных, он находится в позиции 1, 3

 mydata %>% 
      separate(ID, into = c("A", "B", "C"), c(1, 3 ), remove = FALSE)
  

-вывод

 #       ID A  B    C Data
#1 mw21e10 m w2 1e10  878
#2 mw61e10 m w6 1e10  908
#3 mw61e10 m w6 1e10 1073
  

Или base R с помощью Map

 mydata[c('A', 'B', 'C')] <- Map(substring, mydata$ID, 
                         MoreArgs = list(first = a, last = b))
  

данные

 mydata <- structure(list(ID = c("mw21e10", "mw61e10", "mw61e10"), Data = c(878L, 
908L, 1073L)), class = "data.frame", row.names = c(NA, -3L))
  

Комментарии:

1. Я установил Tidyverse , но все равно функция unnest_wider не может быть найдена

2. @Al14 это из tidyr . Можете ли вы показать packageVersion('tidyr')

3. packageVersion('tidyr') является 0.8.3

4. @Al14 я использовал 1.1.2

Ответ №2:

Один dplyr и purrr вариант может быть:

 df %>%
 bind_cols(map2_dfc(.x = c(1,2,4),
                    .y = c(1,3,7),
                    ~ df %>%
                     transmute(col = substr(ID, .x, .y))) %>%
            set_names(c("A", "B", "C")))

       ID Data A  B    C
1 mw21e10  878 m w2 1e10
2 mw61e10  908 m w6 1e10
3 mw61e10 1073 m w6 1e10