Как получить второй подэлемент каждого элемента в списке
Я знаю, что раньше сталкивался с этой проблемой, но на данный момент у меня немного ментальный блок. и поскольку я не могу найти его на SO, я отправлю его здесь, чтобы найти его в следующий раз.
У меня есть dataframe, который содержит поле, представляющее метку ID. Эта метка имеет две части: альфа-префикс и числовой суффикс. Я хочу разбить его и создать два новых поля с этими значениями.
structure(list(lab = c("N00", "N01", "N02", "B00", "B01", "B02",
"Z21", "BA01", "NA03")), .Names = "lab", row.names = c(NA, -9L
), class = "data.frame")
df$pre<-strsplit(df$lab, "[0-9]+")
df$suf<-strsplit(df$lab, "[A-Z]+")
Что дает
lab pre suf
1 N00 N , 00
2 N01 N , 01
3 N02 N , 02
4 B00 B , 00
5 B01 B , 01
6 B02 B , 02
7 Z21 Z , 21
8 BA01 BA , 01
9 NA03 NA , 03
Итак, первый strsplit работает отлично, а второй дает список, каждый из которых имеет два элемента, пустую строку и результат, который я хочу, и заполняет их оба в столбце dataframe.
Как выбрать второй подэлемент из каждого элемента списка? (или, есть лучший способ сделать это)
Ответы
Ответ 1
Чтобы выбрать второй элемент каждого элемента списка:
R> sapply(df$suf, "[[", 2)
[1] "00" "01" "02" "00" "01" "02" "21" "01" "03"
Альтернативный подход с использованием регулярных выражений:
df$pre <- sub("^([A-Z]+)[0-9]+", "\\1", df$lab)
df$suf <- sub("^[A-Z]+([0-9]+)", "\\1", df$lab)
Ответ 2
Прежде всего: если вы используете str(df)
, вы увидите, что df$pre
- list
. Я думаю, вы хотите vector
(но я могу ошибаться).
Вернуться к проблеме - в этом случае я буду использовать gsub
:
df$pre <- gsub("[0-9]", "", df$lab)
df$suf <- gsub("[A-Z]", "", df$lab)
Это гарантирует, что оба столбца являются векторами, но они не сработают, если ваш ярлык не с ключа (т.е. 'AB01B'
).
Ответ 3
с purrr:: map это будет
df$suf %>% map_chr(c(2))
для получения дополнительной информации о purrr:: map