我想将数据框expect
的列中的数字和字符分开:
d.df
预期产出:
col1
ab 12 14 56
xb 23 234 2342 2
ad 23 45
我知道它会与此类似,但我不确定分隔符
col1 col2
ab 12 14 56
xb 23 234 2342 2
ad 23 45
我尝试了很多方法,输出是:
t <- as.data.frame(str_match(d$col1,"^(.*)"))
答案 0 :(得分:4)
您可以使用separate
中的tidyr
。
library(tidyr)
d.df %>% separate(col1, c("col1", "col2"), sep="(?<=[a-z]{2} )")
# col1 col2
# 1 ab 12 14 56
# 2 xb 23 234 2342 2
# 3 ad 23 45
正则表达式"(?<=[a-z]{2} )"
是一个后视,意思是“在两个小写字符后跟一个空格后,在字符串中的位置拆分”。 tidyr
似乎对后视的长度有限制,因此{2}
用于指定字母数。
答案 1 :(得分:3)
以下是In [85]: np.allclose(cdist_split(pairs,positions),cdist_merged(pairs,positions))
Out[85]: True
In [86]: np.allclose(cdist_split(pairs,positions),XYZ_merged(pairs,positions))
Out[86]: True
的选项。
data.table
我们将'data.frame'转换为'data.table'( library(data.table)#v1.9.5+
setnames(setDT(df1)[, tstrsplit(col1,
'(?<=[^0-9]) (?=[0-9])', perl=TRUE)], paste0('col', 1:2))[]
# col1 col2
#1: ab 12 14 56
#2: xb 23 234 2342 2
#3: ad 23 45
)。使用devel版本的'data.table'中的setDT(df1)
,通过匹配字母后面的空格和数字部分之前,在'col1'中的空格处拆分。我们使用正则表达式外观(tstrsplit
和((?<=[^0-9])
)进行匹配。
答案 2 :(得分:2)
这里的方法会有很大的不同,具体取决于这实际上是字符串的样子还是一个例子。如果它们总是两个字母和数字,您可以substring
:
> df <- data.frame(col1 = c("ab 12 14 56", "xb 23 234 2342 2", "ad 23 45"))
>
> df$col1.1 <- sapply(df$col1, substring, 0, 2)
>
> df$col1.2 <- sapply(df$col1, substring, 3)
>
> df
col1 col1.1 col1.2
1 ab 12 14 56 ab 12 14 56
2 xb 23 234 2342 2 xb 23 234 2342 2
3 ad 23 45 ad 23 45
如果字符串的长度和位置发生变化,则正则表达式可能更适合。使用基本R方法,您只能提取数字或字母(保留空格):
> df <- data.frame(col1 = c("ab 12 14 56", "xb 23 234 2342 2", "ad 23 45"))
> df$col1.1 <- sapply(regmatches(df$col1, gregexpr("[a-zA-Z]", df$col1)), paste, collapse = "")
> df$col1.2 <- sapply(regmatches(df$col1, gregexpr("[0-9]\\s*", df$col1)), paste, collapse = "")
> df
col1 col1.1 col1.2
1 ab 12 14 56 ab 12 14 56
2 xb 23 234 2342 2 xb 23 234 2342 2
3 ad 23 45 ad 23 45