我试图在一个相当凌乱的数据框中分隔一列。
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;的方法。类型声明。如果有人有任何意见的输入。
答案 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.csv
和sub
的选项。我们最后将这些数字作为一个组((\\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