私は、以下の問題に対して、より短くてきれいな解決法(たぶんひっそりとしたもの)を探しています。 「」「」私がやりたいことR - パターンに一致するすべての文字列を抽出し、リレーショナルテーブルを作成します。
id string
1 A 1.001 xxx 123.123
2 B 23,45 lorem ipsum
3 C donald trump
4 D ssss 134, 1,45
は、区切り文字がある場合には(関係なく、すべての数字を抽出することであるか - >この場合には、私はその文字列を想定しています。私はdata.frame「データ」を持っています「134は、1.45」は、2つの数字に抽出することができます。
が、私はこの(下記のコードを実行するために管理さ)が、:134および1.45)とdata.frame「出力」を作成これに似て探してソリューションは私にとってもとても効率的ではありません(2つのfor-loops)。誰かが(list
にstringr
から)str_extract_all
と数字を抽出し、
# data
data <- data.frame(id = c("A", "B", "C", "D"),
string = c("1.001 xxx 123.123",
"23,45 lorem ipsum",
"donald trump",
"ssss 134, 1,45"),
stringsAsFactors = FALSE)
# creating empty data.frame
len <- length(unlist(sapply(data$string, function(x) gregexpr("[0-9]+[,|.]?[0-9]*", x))))
output <- data.frame(id = rep(NA, len), string = rep(NA, len))
# main solution
start = 0
for(i in 1:dim(data)[1]){
tmp_len <- length(unlist(gregexpr("[0-9]+[,|.]?[0-9]*", data$string[i])))
for(j in (start+1):(start+tmp_len)){
output[j,1] <- data$id[i]
output[j,2] <- regmatches(data$string[i], gregexpr("[0-9]+[,|.]?[0-9]*", data$string[i]))[[1]][j-start]
}
start = start + tmp_len
}
# further modifications
output$string <- gsub(",", ".", output$string)
output$string <- as.numeric(ifelse(substring(output$string, nchar(output$string), nchar(output$string)) == ".",
substring(output$string, 1, nchar(output$string) - 1),
output$string))
output
Unnest - これは私が探していた機能です。素晴らしい投稿 - ありがとう! 1つの質問:L
user2280549
"\\ s"は常に空白文字が1つあればOKです - 確かではありませんでした。 –
(2)と(3)を改善しました。 –