Как получить второй подэлемент каждого элемента в списке - PullRequest
56 голосов
/ 10 мая 2010

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

У меня есть фрейм данных, который содержит поле, представляющее метку идентификатора. Этот ярлык состоит из двух частей: альфа-префикса и числового суффикса. Я хочу разделить его и создать два новых поля с этими значениями в.

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.

Как выбрать второй подэлемент из каждого элемента списка? (или есть ли лучший способ сделать это)

Ответы [ 3 ]

97 голосов
/ 10 мая 2010

Чтобы выбрать второй элемент каждого элемента списка:

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)
5 голосов
/ 04 ноября 2017
4 голосов
/ 10 мая 2010

Прежде всего: если вы используете str(df), вы увидите, что df$pre равно list. Я думаю, что вы хотите vector (но я могу ошибаться).
Вернуться к проблеме - в этом случае я буду использовать gsub:

df$pre <- gsub("[0-9]", "", df$lab)
df$suf <- gsub("[A-Z]", "", df$lab)

Это гарантирует, что оба столбца являются векторами, но произойдет сбой, если ваша метка не из ключа (т.е. 'AB01B').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...