17

我试图在“。”上分割一个字符串。并使用“.”前后的两个字符串创建附加列。

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

4

5 回答 5

32

这应该可以解决问题

R> sapply(strsplit(as.character(h$tes), "\\."), "[[", 2)
[1] "abc" "di"  "lik"
于 2010-09-13T19:48:25.090 回答
10

有了这个stringr包就更容易了:

library(stringr)
str_split_fixed(h$tes, fixed("."), 2)[, 2]
于 2010-09-13T21:25:19.077 回答
8

这与 rcs 的答案相同,但可能更容易理解:

> sapply(strsplit(as.character(h$tes), "\\."), function(x) x[[2]])
[1] "abc" "di"  "lik"
于 2010-09-13T20:04:59.667 回答
7

这个问题在 StackOverflow 上多次出现。

与您的形式完全相同:

本主题中的一些类似问题:

如果您关心速度,那么您应该考虑John 回答中关于fixed参数 to 的strsplit提示。

于 2010-09-14T08:35:45.413 回答
1

或者,如果同时添加两列,您可以省去提取第二个元素的工作:

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"))))
于 2010-09-15T04:49:30.240 回答