Разделение нескольких строковых столбцов и соответствующее переименование новых столбцов - R - PullRequest
1 голос
/ 04 августа 2020

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

В качестве упрощенного примера

test_frame<-tibble(x=c("a1!","b2@","c3$"), y=c("A1$","G2%", NA))

x       y
a1!    A1$
b2@    G2%  
c3$    NA

должно стать чем-то вроде

x_letter   x_number   x_sign    y_letter    y_number    y_sign
a          1          !         A           1           $      
b          2          @         G           2           %
c          3          $         NA          NA          NA

Порядок элементов в строке всегда один и тот же.

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

Что было бы здесь простой подход?

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Это должно быть то, что вам нужно, не самое чистое решение, а простое

library(tidyverse)

test_frame<-tibble(x=c("a1!","b2@","c3$"), y=c("A1$","G2%", NA))


pipe_to_do <- . %>%
  str_split_fixed(string = .,pattern = "(?<=.)",n = 3) %>% 
  as_tibble() %>% 
  rename(letter = V1,
         number = V2,
         sign = V3)

xx <- test_frame %>%
  summarise(across(everything(),.fns = pipe_to_do))
#> Warning: The `x` argument of `as_tibble.matrix()` must have unique column names if `.name_repair` is omitted as of tibble 2.0.0.
#> Using compatibility `.name_repair`.
#> This warning is displayed once every 8 hours.
#> Call `lifecycle::last_warnings()` to see where this warning was generated.


names_xx <- names(xx)

combine_names <- function(df,name) {
  str_c(name,"_",df)
}

combine_names_func <- function(df,name){
  df %>% 
    rename_with(.fn = ~ combine_names(.x,name))
}

map2(xx,names_xx,combine_names_func) %>% 
  reduce(bind_cols)
#> # A tibble: 3 x 6
#>   x_letter x_number x_sign y_letter y_number y_sign
#>   <chr>    <chr>    <chr>  <chr>    <chr>    <chr> 
#> 1 a        1        !      "A"      "1"      "$"   
#> 2 b        2        @      "G"      "2"      "%"   
#> 3 c        3        $      ""       ""       ""

Создано 04.08.2020 с помощью пакета реплекс (v0.3.0)

0 голосов
/ 04 августа 2020

Вы можете использовать str_extract:

library(stringr)
df <- data.frame(
  x_letter = str_extract(test_frame$x,"^[a-z]"),
  x_number = str_extract(test_frame$x,"(?<=^[a-z])[0-9]"),
  x_sign = str_extract(test_frame$x,".$"),
  y_letter = str_extract(test_frame$y,"^[A-Z]"),
  y_number = str_extract(test_frame$y,"(?<=^[A-Z])[0-9]"),
  y_sign = str_extract(test_frame$y,".$")
)

Результат:

df
  x_letter x_number x_sign y_letter y_number y_sign
1        a        1      !        A        1      $
2        b        2      @        G        2      %
3        c        3      $     <NA>     <NA>   <NA>
...