#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)