0

データフレームに次のような列があります。

[1] [0.50 .. 0.52] [0.52 .. 0.54] [0.54 .. 0.56] [0.56 .. 0.58]
[5] [0.58 .. 0.60] [0.60 .. 0.62] [0.62 .. 0.64] [0.64 .. 0.66]
[9] [0.66 .. 0.68] [0.68 .. 0.70] [0.70 .. 0.72] [0.72 .. 0.74]
[13] [0.74 .. 0.76] [0.76 .. 0.78] [0.78 .. 0.80] [0.80 .. 0.82]

この列の2つの数値の平均を取りたいと思います。しかし、どうすればいいのかわかりません。gsub()を使用して「..」を置き換えようとしましたが、角かっこを削除できず、数字を抽出する方法が見つからないようです。これらの数値の平均を取得するための最良の方法は何でしょうか?

4

3 に答える 3

4

を使用gsubして括弧を取り出し (二重エスケープを忘れないようにしてください)、次に を使用strsplitして数字を区切り、sapply結果のリストをmeanand で処理しas.numericます。

x <- c("[0.52 .. 0.54]", "[0.54 .. 0.56]")

sapply(strsplit(gsub("[\\[\\]]","",x,perl=T)," .. "),function(x) mean(as.numeric(x)))
[1] 0.53 0.55
于 2012-07-19T11:09:27.813 に答える
4

Rの正規表現の基本関数(gsub、regexp、...)またはstringrパッケージ(str_extract)を使用できます。

require(stringr)

string <- c("[0.50 .. 0.52]", "[0.52 .. 0.54]", "[0.54 .. 0.56]", "[0.56 .. 0.58]")

number <- as.numeric(str_extract(string, "\\d\\.\\d+"))
number
[1] 0.50 0.52 0.54 0.56

次に、 zooのrollmean関数を使用して、1 と 2、3 と 4 の間の平均を計算できます。

require(zoo)
average <- rollmean(number, 2)
average[as.logical(seq_along(average) %%2 )]
[1] 0.51 0.55
于 2012-07-19T11:02:21.797 に答える
3

gsub特殊文字をスペースに置き換えるために使用します。次にstrsplit、次のようにしmeanます。

最初にデータをレプリケートします。

x <- scan(what="character", quote='"', sep=" ", text='"[0.50 .. 0.52]" "[0.52 .. 0.54]" "[0.54 .. 0.56]" "[0.56 .. 0.58]" "[0.58 .. 0.60]" "[0.60 .. 0.62]" "[0.62 .. 0.64]" "[0.64 .. 0.66]" "[0.66 .. 0.68]" "[0.68 .. 0.70]" "[0.70 .. 0.72]" "[0.72 .. 0.74]" "[0.74 .. 0.76]" "[0.76 .. 0.78]" "[0.78 .. 0.80]" "[0.80 .. 0.82]"')

次に、 と を使用しgsubます。sapplymean

xx <- gsub("\\[|\\.\\.|\\]", "", x)
sapply(strsplit(xx, "  "), function(x)mean(as.numeric(x)))

結果:

 [1] 0.51 0.53 0.55 0.57 0.59 0.61 0.63 0.65 0.67 0.69 0.71 0.73 0.75 0.77 ...

正規表現は次のように機能します。

  • 括弧[ ]は、括弧内のテキストを置き換えることを意味します
  • [ブラケットを置き換えたいのです]が、これらは正規表現で意味があるため、これらをエスケープする必要があります\\[\\]
  • 最後に、|logical と同じ意味ORです。つまり、角括弧または二重ピリオドを検索します。

R の正規表現については、?regexpまたはで詳しく読むことができます?gsub

于 2012-07-19T11:10:02.927 に答える