Вопрос
Я пытаюсь разделить строку на ". и создайте дополнительные столбцы с двумя строками до и после ".".
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
Версия должна была работать. Однако я предполагаю, что это должно быть легко :-)
С уважением, // м
Решение
Это должно сделать свое дело
R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di" "lik"
Другие советы
С stringr
Пакет это еще проще:
library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]
Это то же самое, что и ответ RCS, но может быть легче понять:
> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di" "lik"
Этот вопрос появляется несколько раз на Stackoverflow.
В точной форме, как ваша:
- Выбор первого элемента
strsplit
- Выбор второго элемента, отдельный по космосу
- Выбор второго элемента отдельно по точке Я рекомендую этот вопрос, чтобы увидеть, сколько способов его можно было достичь.
Какой -то подобный вопрос в этой теме:
И если вы заботитесь о скорости, то вам следует рассмотреть Совет от Джона ответа о fixed
параметр к strsplit
.
В качестве альтернативы, вы можете сохранить работу по выявлению второго элемента, если вы добавите оба столбца одновременно:
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"))))