1

私は R にまったく慣れていないので、このタイプの文字列から距離を抽出して入力する方法を知りたいと思います:「@RunKeeper で 0.56 マイルの散歩を完了しました」。そこで、「0.56」、「mi」、「walk」を 3 つの個別の変数に格納したいと思います。どうすればいいですか?

どうも!ジェローン。

私はこれを試しました:

can.be <- function(object, class="numeric") 
  suppressWarnings(!is.na(as(object, class)))

str.vec <- c(text)

str.vec <- strsplit(str.vec, " ")

strsplit(str.vec, " ") のエラー: 非文字引数

pos <- sapply(str.vec, function(x) which(sapply(x, can.be)))
[[1]]

0.56 4

[[2]] 名前付き整数(0)

... mapply( [[, str.vec, pos) mapply( [[, str.vec, pos+1) mapply( [[, str.vec, pos+2)

しかし、今、私はこのエラーが発生します:

> mapply(`[[`, str.vec, pos)
Error in .Primitive("[[")(dots[[1L]][[2L]], dots[[2L]][[2L]]) : 
  attempt to select less than one element
> mapply(`[[`, str.vec, pos+1)
Error in pos + 1 : non-numeric argument to binary operator
> mapply(`[[`, str.vec, pos+2)
Error in pos + 2 : non-numeric argument to binary operator

サンプルデータ (テキスト):

Just completed a 0.56 mi walk with @RunKeeper. Check it out! http://t.co/lCyzzFeSwq #RunKeeper
Just completed a run in 0:00  with @RunKeeper. Check it out! http://t.co/dJB9DBwF4o #RunKeeper
Just completed a 1.83 km run with @RunKeeper. Check it out! http://t.co/f0S2aKnWXz #RunKeeper
Just completed a 6.03 km run - Gettin' it done! http://t.co/uQ7rBn6M #RunKeeper
Just completed a 1.81 mi walk with @RunKeeper. Check it out! http://t.co/R70fvkLDES #RunKeeper
4

2 に答える 2

2

それらがその特定の順序であると予想される場合

can.be <- function(object, class="numeric") 
  suppressWarnings(!is.na(as(object, class)))

str <- strsplit("Just completed a 0.56 mi walk with @RunKeeper", " ")[[1]]

pos <- which(sapply(str, can.be))

> str[pos]
[1] "0.56"
> str[pos+1]
[1] "mi"
> str[pos+2]
[1] "walk"

シーケンスが常に同じである必要があります。ただし、一連の測定単位 ( 、 など) をハードコーディングしてmikmそれらをシーケンスに識別することができます (ただし、常に数値、次にmiを使用する可能性が高くなります。文字列に他の数値が含まれていない場合、この方法は非常に堅牢なはずです。

編集:

ベクトルの場合:

str.vec <- c("Just completed a 0.56 mi walk with @RunKeeper", "Just completed a 13 mi cycling with @Michele")

str.vec <- strsplit(str.vec, " ")

pos <- sapply(str.vec, function(x) which(sapply(x, can.be)))

> mapply(`[[`, str.vec, pos)
[1] "0.56" "13"  
> mapply(`[[`, str.vec, pos+1)
[1] "mi" "mi"
> mapply(`[[`, str.vec, pos+2)
[1] "walk"    "cycling"
于 2013-06-26T09:12:04.777 に答える
0

文字列が常に同じ形式の場合は、次を使用できます。

dist<-as.numeric(substr(text,18,21))
unit<-substr(text,22,23)
way<-substr(text,25,28)

ただし、たとえば、数値の長さが変更された場合 (たとえば、0.56 から 12.21 に変更された場合) は機能しません。あなたはそれが起こらないことを確認しなければなりません!

于 2013-06-26T09:06:15.483 に答える