2015-09-15 2 views
1

Я пытаюсь извлечь и вставить элементы списка списков, сгенерированных с помощью strsplit. Например:Извлечь и вставить несколько элементов из списка списков, сгенерированных strsplit

cat<-c("X0831_d8_f1_2s_wt_8_ROI_009", "X0831_d8_f1_2s_wt_8_ROI_008", 
"X0831_d8_f1_2s_wt_8_ROI_007", "X0831_d8_f1_2s_wt_8_ROI_006", 
"X0831_d8_f1_2s_wt_8_ROI_005", "X0831_d8_f1_2s_wt_8_ROI_004", 
"X0831_d8_f1_2s_wt_8_ROI_003", "X0831_d8_f1_2s_wt_8_ROI_002", 
"X0831_d8_f1_2s_wt_8_ROI_001", "X0831_d8_f1_10s_wt_8_ROI_019", 
"X0831_d8_f1_10s_wt_8_ROI_018") 

я могу генерировать требуемый вектор символов с помощью ldply:

mouse<-ldply(strsplit(cat, "_")) 
paste(mouse$V4,mouse$V8,sep="_") 

но искал более элегантный метод сделать это. Может быть, использовать sapply или что-то подобное?

я могу генерировать вектор символов, содержащий один элемент:

sapply(strsplit(cat, "_"), "[[",4)

, но не может выяснить способ извлечения обоих элементов (и вставить их вместе).

+0

Проверьте [grep] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/grep.html), в частности 'regexpr' и' gregexpr', они будут давать вы первый экземпляр и позиция всех экземпляров соответственно. Это в сочетании с 'substr' заключается в том, как я делаю большую часть этого типа работы – Badger

+0

, если первая строка всегда заканчивается' s', вы можете 'gsub (". * _ (\\ d + s) _. * _ (\\ d + $) "," \\ 1 _ \\ 2 ", cat)' – jenesaisquoi

ответ

3

Ваш пример в plyr довольно хорошо уже, но вот как это сделать в sapply, используя anonymous function:

sapply(strsplit(cat, "_"), function(x){paste(x[[4]], x[[8]], sep="_")}) 

В apply семьи, и некоторые другие функции могут использовать анонимные функции, где вы определяете их в вызове. В этом случае у нас есть функция, которая берет каждый член списка (как x), а затем вставляет x[[4]] и x[[8]] вместе.

+0

Отлично. Действительно полезное объяснение. – Damian