Применить strsplit rolsise

Я пытаюсь разбить строку на "." и создайте дополнительные столбцы с двумя строками до и после ".".

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", "di", "lik". Однако я не могу это понять. Я думаю, strsplit не векторизован, но тогда я думал, что версия sapply должна сработать. Однако я предполагаю, что это должно быть легко: -)

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

Ответы

Ответ 1

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

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

Ответ 2

С пакетом stringr это еще проще:

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

Ответ 3

Это то же самое, что и ответ rcs, но может быть проще понять:

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

Ответ 4

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

В точной форме как ваш:

Некоторые похожие вопросы в этом разделе:

И если вам нужна скорость, вы должны подумать о подсказке от Джона о параметре fixed до strsplit.

Ответ 5

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

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"))))