Мені потрібно маніпулювати наступним фреймом даних.
РЕДАГУВАТИ 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"