/ / R - Розбиття тексту стовпця на 2 стовпчики без роздільника - r

R - Розбиття тексту стовпця на 2 стовпці без роздільника - r

Мені потрібно маніпулювати наступним фреймом даних.

РЕДАГУВАТИ PATCH_CODE - це не завжди 2 букви, інколи випадкові випадки мають одну букву, і в такому випадку мені потрібно вставити 1 у результатний стовпець коду.

початковий кадр даних: head(data,4)

PATCH_CODE    TERR        PC1
A1       MENS_10  0.8629186
A3       MENS_10 -0.2703238
B1       MENS_10  0.9516067
B2       MENS_10 -0.1722446

отриманий кадр даних:

PATCH        CODE    TERR        PC1
A            1     MENS_10     0.8629186
A            3     MENS_10    -0.2703238
B            1     MENS_10     0.9516067
B            2     MENS_10    -0.1722446

Я бачив приклади, як це досягти, коли стовпчик, який потрібно розділити, має розпізнавальний текст, такий як кома, colsplit в reshape але мені не вдалося знайти рішення для такої структури, як моя. Чи можливо це?

вихід str (дані)

"data.frame":   240 obs. of  3 variables:
$ PATCH_CODE: Factor w/ 42 levels "A","A1","A2",..: 2 3 4 7 8 12 13 16 17 18 ...
$ TERR      : Factor w/ 19 levels "MENS_10","MENS_14",..: 1 1 1 1 1 1 1 1 1 1 ...
$ PC1       : num  0.548 1.228 0.273 5.548 3.853 ...

Відповіді:

3 для відповіді № 1

Ви можете використовувати strsplit. Передача порожнього рядка як роздільника призводить до розбиття кожної літери.

a <- c("A1", "B1", "C2", "D5", "R3")
strsplit(a, "")


[[1]]
[1] "A" "1"

[[2]]
[1] "B" "1"

[[3]]
[1] "C" "2"

[[4]]
[1] "D" "5"

[[5]]
[1] "R" "3"

Якщо ви хочете помістити це в матрицю

> do.call(rbind, strsplit(a, ""))
[,1] [,2]
[1,] "A"  "1"
[2,] "B"  "1"
[3,] "C"  "2"
[4,] "D"  "5"
[5,] "R"  "3"

1 для відповіді № 2

За звуками вашого опису, strsplit повинні добре працювати. Якщо ваші дані трохи складніші, ви також можете переглянути можливе regex-основний розчин.

Для цього конкретного прикладу спробуйте:

do.call(rbind, strsplit(mydf$PATCH_CODE,
split = "(?<=[a-zA-Z])(?=[0-9])",
perl = TRUE))
#     [,1] [,2]
# [1,] "A"  "1"
# [2,] "A"  "3"
# [3,] "B"  "1"
# [4,] "B"  "2"