9

ID.A、ID.B、および DISTANCE 列を含む R のデータフレームがあります。ここで、距離は ID.A と ID.B の間の距離を表します。ID.A の各値 (1->n) に対して、ID.B と DISTANCE の複数の値が存在する場合があります (つまり、ID.A に複数の重複行が存在する場合があります。たとえば、それぞれが異なる ID.B を持つ値 4 のすべて)。とその行の距離)。

ID.A が重複している行を削除できるようにしたいと考えていますが、ID.A レコードごとに最小の距離値が残るように距離値を条件としています。

うまくいけば、それは理にかなっていますか?

よろしくお願いします

編集

例が私のテキストよりも役立つことを願っています。ここで、ID.A = 3 の 2 行目と 3 行目を削除します。

myDF <- read.table(text="ID.A ID.B DISTANCE
  1 3 1
  2 6 8
  3 2 0.4
  3 3 1
  3 8 5
  4 8  7
  5 2 11", header = TRUE)
4

3 に答える 3

7

ベースRでも簡単に実行できdatます。データフレームの場合、

do.call(rbind, 
        by(dat, INDICES=list(dat$ID.A), 
           FUN=function(x) head(x[order(x$DISTANCE), ], 1)))
于 2012-05-31T14:26:25.250 に答える
7

1 つの可能性:

myDF <- myDF[order(myDF$ID.A, myDF$DISTANCE), ] 

newdata <- myDF[which(!duplicated(myDF$ID.A)),]

与える:

    ID.A ID.B DISTANCE
1    1    3      1.0
2    2    6      8.0
5    3    2      0.4
6    4    8      7.0
7    5    2     11.0
于 2012-06-01T03:15:15.463 に答える
5

plyrそのためにパッケージを使用できます。たとえば、データが次のような場合:

d <- data.frame(id.a=c(1,1,1,2,2,3,3,3,3),
                id.b=c(1,2,3,1,2,1,2,3,4),
                dist=c(12,10,15,20,18,16,17,25,9))

  id.a id.b dist
1    1    1   12
2    1    2   10
3    1    3   15
4    2    1   20
5    2    2   18
6    3    1   16
7    3    2   17
8    3    3   25
9    3    4    9

ddply次のような関数を使用できます。

library(plyr)
ddply(d, "id.a", function(df) return(df[df$dist==min(df$dist),]))

与える:

  id.a id.b dist
1    1    2   10
2    2    2   18
3    3    4    9
于 2012-05-31T14:21:14.477 に答える