在数据框中按数字拆分R中的列

时间:2016-12-23 20:25:37

标签: r regex dataframe split

我试图在一个相当凌乱的数据框中分隔一列。

section
View 500
V458
453

我想从中创建一个新列。使用如下的首选输出。

section  section numbers  
View     500
V        458
         453

我一直在努力研究它,但我有时间研究它。我可以在第一行的情况下将它们分开,因为我可以像这样使用正则表达式。

df_split <- separate(df, col = section, into = c("section", "section_number"), sep = " +[1-9]")

但我似乎找不到使用&#34;或&#34;的方法。类型声明。如果有人有任何意见的输入。

5 个答案:

答案 0 :(得分:6)

使用简单的gsub对我来说是个选择:

section <- c('View 500', 'V458', '453')

cbind(section = trimws(gsub('[0-9]', '', section)), 
      section_numbers = trimws(gsub('[a-zA-Z]', '', section)))

我使用trimws删除任何不需要的空格。

输出:

    section section_numbers
[1,] "View"  "500"          
[2,] "V"     "458"          
[3,] ""      "453" 

答案 1 :(得分:5)

您可以使用tidyr

tidyr::extract(df,section, c("section", "section number"), 
               regex="([[:alpha:]]*)[[:space:]]*([[:digit:]]*)")
  section section number
1    View            500
2       V            458
3                    453

答案 2 :(得分:3)

您可以使用来自for($k=0;$k<20;$k++){ echo $k.'<br>Sleep for 1 second.'; sleep(1); } 包的extract,您可以使用该tidyr包指定捕获组,在此处将它们设为可选,并且处理不同情况非常灵活:

library(tidyr)
df %>% extract(section, into = c("alpha", "numeric"), regex = "([a-zA-Z]+)?\\s?(\\d+)?")

#  alpha numeric
#1  View     500
#2     V     458
#3  <NA>     453

答案 3 :(得分:1)

以下是使用base R read.csvsub的选项。我们最后将这些数字作为一个组((\\d+)$)捕获,并用\\1中的逗号和组的反向引用(sub)替换,并用{{1}读取}}

read.csv

答案 4 :(得分:0)

stringr(假设原始df只有一列名为section):

library(stringr)
df_split <- as.data.frame(str_match(df$section, "([A-Za-z]*)\\s*([0-9]*)")[,2:3])
names(df_split) <- c('section', 'section numbers')
df_split

#  section section numbers
#1    View             500
#2       V             458
#3                     453