2010-05-10 2 views
46

Я знаю, что раньше сталкивался с этой проблемой, но на данный момент у меня немного ментальный блок. и поскольку я не могу найти его на 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.

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

ответ

82

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

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) 
+0

, что это ' "[["' делает в этом примере? – user5359531

+0

выбирает отдельные элементы списка, смотри? "[[" – rcs

4

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

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

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

+0

Ответ RCS на самом деле отвечает на мой главный вопрос (как вернуть его второе значение из списка), но ваш ответ кажется более элегантным для того, что я действительно хочу. Отлично сработано. – PaulHurleyuk

+1

Не могли бы вы объяснить, как «[[» работал в сочленении. Определение sapply указано по адресу: http://www.inside-r.org/r-doc/base/sapply. – and0rsk

Смежные вопросы