2012-01-19 9 views
1

これは私の最初の投稿ですので、うまくいけば私は正しくやりたいことを説明します。私はRにはまだまだ新しく、これに答える記事を読んでいるかもしれませんが、私の人生は彼らの意味を理解できません。これはすでに答えられている場合は、事前に謝罪します。は問題を抱えていますが、データフレーム出力が必要です - R

私はラジオコードラからのGPS位置の非常に大きなデータセットを持っており、毎日の位置の数に一貫性がありません。私は、データセットを調べ、GPS信号の精度レベルに基づいて毎日1つのデータポイントを選択したいと考えています。

したがって、基本的には次のようになります。

Accuracy Month Day Easting Northing Etc 
    5   6  1  ####### ########  # 
    3.2  6  1  ####### ########  # 
    3.8  6  1  ####### ########  # 
    1.6  6  2  ####### ########  # 
    4   6  3  ####### ########  # 
    3.2  6  3  ####### ########  # 

そして、私は、関連するデータの残りの部分を維持しながら、毎日(最低精度の測定)のための最も正確なポイントを引き出したいです。現在

私は、しかし、私は、関連する座標やタイミングを取ることができない、私は成功し、1日につき1つの最小値を取得することができ、この方法を使用するtapply機能

datasub1<-subset(data,MONTH==6) 
tapply(datasub1$accuracy, datasub1$day, min) 

を使用して、他のすべての重要なされていますそれに伴って情報が得られ、データセットが300,000行に近くなるので、私は実際に手で行うことはできません。

だから、基本的に、私はtapplyと同じ結果を得る必要があるが、代わりに個々の点で、私はその点が中に発見されたことを行全体を必要としています。

感謝を事前に手を貸すことができ、誰に。それ以上の情報が必要な場合は、私に教えてください、私はあなたにそれを得るために全力を尽くします。

答えて

6

ddplyを使用できます。これはdata.frameを1日に1個にカットし、各部分に関数を適用します。

# Sample data 
n <- 100 
d <- data.frame(
    Accuracy = round(runif(n, 0, 5), 1), 
    Month = sample(1:2, n, replace=TRUE), 
    Day  = sample(1:5, n, replace=TRUE), 
    Easting = rnorm(n), 
    Northing = rnorm(n), 
    Etc  = rnorm(n) 
) 

# Extract the maximum for each day 
# (In case of ties, you only have the first row) 
library(plyr) 
ddply( 
    d, 
    c("Month", "Day"), 
    function (u) u[ which.min(u$Accuracy), ] 
) 
+0

+1の「ddply」!あなたが 'which.min(u $ Accuracy)'を望むことを除いて。 –

+0

優秀!ありがとうございました。私は検索で数回見つけたことがありましたが、私は自分のものにどのように適用するのか分かりませんでした。私が言ったように、Rには新しく、それは間違いなく強い訴訟ではない。再度、感謝します。私は正確さ、月、そして日の後のプログラミングが何であるかを完全には分かっていません。私はそれらといくつか変な番号を取得していた、と私はそれをすべて取り出したときに私はそれがほしいと思った。しかし、そのすべて今良い、私の時間のおぼろを救った。再度、感謝します。 – HeidelbergSlide

+0

@ mathematical.coffee:元の質問と一致するように、私は最大値を分で置き換えました。 –

2

これは、少なくとも最初にplyr機能の基礎を形成し、分割適用パラダイム使って一つのベース・ソリューションです:あなたはどのような方法で集約したくない

lapply( 
    split(dat, list(dat$Month, dat$Day)), 
     function(d) d[ which.min(d$Accuracy), ]) 
+0

私は、誰かがどのようにこれを基盤に近づけるのか不思議でした。私は自分自身で答えを持っていませんでした。ニースの解決策。あなたのソリューションは(私にとっては)リスト構造を生成するように見えて、HeidelbergSlideは素晴らしいデータフレームを与えることはできません。あなたの応答を修正してsapplyを使ってt()でラッピングすると、ポスターの希望の結果をより密接に表すデータフレームが得られるようです。 –

2

を本当に。あなたがする必要があるのは、毎日の最小値を選択することだけです。だから、あなたがする必要があるのは、最小値を見つけてマッチを選択することだけです。

mins <- ave(datasub1$accuracy, datasub1$day, FUN = min) 
datasub1[ datasub1$accuracy == mins, ] 

月や年などが必要な場合は、それをリストとして第2引数のaveに追加してください。ここに別の構文があります。

mins <- with(datasub1, ave(accuracy, day, month, FUN = min)) 
+0

私はこれが "...そのポイントが見つかった行全体が必要です"とは思えません。これは、精度と日付の列のみを返します。 – WhiteViking

+0

が修正されました...これは編集履歴がありませんので、それを忘れてしまったか、後で追加されました – John

関連する問題