2010-09-13 2 views
14

Im пытается разбить строку на "." и создайте дополнительные столбцы с двумя строками до и после «.».применить strsplit rowwise

tes<-c("1.abc","2.di","3.lik") 
dat<-c(5,3,2) 
h<-data.frame(tes,dat) 
h$num<-substr(h$tes,1,1) 

h$prim<-unlist(strsplit(as.character(h$tes),"\\."))[2] 
h$prim<-sapply(h$tes,unlist(strsplit(as.character(h$tes),"\\."))[2]) 

Я бы хотел h$prim содержать "ABC", "ди", "ЛИК" .. Однако I'm не в состоянии понять это. Думаю, strsplit не векторизован, но тогда я думал, что версия sapply должна сработать. Однако я предполагаю, что это должно быть легко :-)

С уважением, // M

ответ

30

Это должно сделать трюк

R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2) 
[1] "abc" "di" "lik" 
+1

AllRight .. Однако не так просто, как я думал .. Что это? " [[" вещь? – Misha

+5

@ Миша: сложная вещь о strsplit заключается в том, что она возвращает список. Это "[[" вещь - это функция для извлечения из этого списка. 2 является аргументом для этой функции, что означает, что он берет второй элемент списков, возвращаемых strsplit. См. Также? "[[" В R. и thx @rcs, это умно! –

+2

Это оператор индексирования. «[[" может использоваться для выбора одного элемента, отбрасывающего имена, см. '? Извлечение'. Вы также можете использовать «[». – rcs

7

Это то же самое, как ответ RCS', но может быть проще понять:

> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]]) 
[1] "abc" "di" "lik" 
+0

@ все из вас ... Теперь я понял. // М – Misha

9

с stringr пакета стало еще проще:

library(stringr) 
str_split_fixed(h$tes, fixed("."), 2)[, 2] 
7

Этот вопрос появляется несколько раз в StackOverflow.

В точной форме, как у вас:

Некоторые подобный вопрос в этой теме:

И если вы заботитесь о скорости, то вам следует рассмотреть tip from John answer about fixed parameter to strsplit.

1

В качестве альтернативы, вы можете сэкономить работу вытаскивания 2-го элемента, если вы добавите обе колонки в то же время:

tes <- c("1.abc","2.di","3.lik") 
dat <- c(5,3,2) 
h <- data.frame(tes, dat, stringsAsFactors=FALSE) 
values <- unlist(strsplit(h$tes, ".", fixed=TRUE)) 
h <- cbind(h, matrix(values, byrow=TRUE, ncol=2, 
        dimnames=list(NULL, c("num", "prim")))) 
Смежные вопросы