R классификация числа

#r

#r

Вопрос:

Я работаю в R, но я не очень хорошо знаю, как извлечь из любого числа ряд данных, т. Е. Из числа 20102168056, я хочу разделить его следующим образом

  • 2010 -> год
  • 2 -> семестр
  • 168 -> университетская карьера
  • 056 -> уникальное число

Я пытался сделать это с помощью if, но каждый раз, когда я получал больше ошибок, я новичок в этом, и я хотел бы знать, можете ли вы мне помочь (кстати, это для любого числа, например 20211888070, поэтому я не использовал if, который я поднял).

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

1. Это число или строка? Если это число, вы можете использовать %/% (целочисленное деление), %% модуль или различные арифметические механизмы для извлечения этих компонентов. Если это строка (или, возможно, это число, и вы хотите принудительно использовать строку с as.character ), то вы можете просто использовать substr(x, 1, 4) и тому подобное для каждого компонента.

2. read.fwf(textConnection('20102168056'), widths = c(4, 1, 3, 3))

Ответ №1:

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

 library(tidyverse)

df <- tibble(original = c(20102168056, 20141152013, 20182008006))

df %>% 
    separate(original, into = c("year", "semester", "university_career", "unique_number"), sep = c(4,5,8,11))

# A tibble: 3 × 4
  year  semester university_career unique_number
  <chr> <chr>    <chr>             <chr>        
1 2010  2        168               056          
2 2014  1        152               013          
3 2018  2        008               006  
 

Возможно, вам захочется преобразовать некоторые столбцы в целое число:

 df %>% 
    separate(original, into = c("year", "semester", "university_career", "unique_number"), sep = c(4,5,8,11)) %>% 
    mutate(across(year:unique_number, as.integer))

# A tibble: 3 × 4
   year semester university_career unique_number
  <int>    <int>             <int>         <int>
1  2010        2               168            56
2  2014        1               152            13
3  2018        2                 8             6
 

Ответ №2:

Мы можем использовать stringr::str_match() .

 library(tidyverse)

data <- c(20102168056, 20102168356)

str_match(data, '^(\d{4})(\d{1})(\d{3})(\d{3})') %>%
    as.data.frame() %>% 
    set_names(c('value', 'year', 'semester', 'university_career', 'unique_number'))
#>         value year semester university_career unique_number
#> 1 20102168056 2010        2               168           056
#> 2 20102168356 2010        2               168           356
 

Создано 2021-12-08 пакетом reprex (v2.0.1)

Ответ №3:

Вы можете использовать substr() функцию, если сначала преобразуете число в символ с as.character() помощью .

 test <- '20102168056'
data <- list()

data$year <- substr(test, 1, 4)
data$semester <- substr(test, 5, 5)
data$uni_career <- substr(test, 6, 8)
data$unique_num <- substr(test, 9, 11)

print(data)
#> $year
#> [1] "2010"
#> 
#> $semester
#> [1] "2"
#> 
#> $uni_career
#> [1] "168"
#> 
#> $unique_num
#> [1] "056"
 

Создано 2021-12-08 пакетом reprex (v2.0.1)