R按列分割多列

时间:2015-08-09 02:51:13

标签: r split

我想将数据框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,"^(.*)"))

3 个答案:

答案 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