2

「名前」列の値が同じで、「距離」列の値が異なる複数の行で構成されるデータフレームがあります。「名前」に同一のエントリを持つすべての行を削除し、距離が最も小さい行を保存したいと思います。「距離」値を比較する前に、すべての行を互いに比較して「名前」エントリが同一かどうかを確認するよりも簡単な方法はありますか? 実際のデータ フレームは、約 14000 行 x 14 列です。私は答えを探しましたが、まだ何も見つけられていないので、どんな助けにもとても感謝しています!

これは元のデータ フレームになります。

     name      distance number
[1,] "apple"   "2.5"    "4"   
[2,] "banana"  "3"      "6"   
[3,] "apple"   "1"      "2"   
[4,] "satsuma" "4"      "8"   
[5,] "satsuma" "7.5"    "1"   
[6,] "melon"   "3"      "3"   
[7,] "satsuma" "1"      "6"  

これは私が取得したいものです(必ずしもこの順序ではありません):

     name      distance number
[1,] "banana"  "3"      "6"   
[2,] "apple"   "1"      "2"   
[3,] "melon"   "3"      "3"   
[4,] "satsuma" "1"      "6"   
4

4 に答える 4

4

まず、 data.frame をnameおよびでソートしdistance、各名前の最初の行として保持する行をマークします。

sorted <- dat[order(dat$name, dat$distance), ]

keep <- c(TRUE, head(sorted$name,-1) != tail(sorted$name,-1))

結果は

sorted[keep, ]
于 2013-04-03T16:54:02.577 に答える
2

aggregate以下のmergeように使用できます

DF <- read.table(text='name      distance number
apple   2.5    4   
banana  3      6   
apple   1      2   
satsuma 4      8   
satsuma 7.5    1   
melon   3      3   
satsuma 1      6', header=TRUE)

merge(DF, aggregate(distance ~ name, data = DF, min))
##      name distance number
## 1   apple        1      2
## 2  banana        3      6
## 3   melon        3      3
## 4 satsuma        1      6
于 2013-04-03T16:42:44.367 に答える
1

開始するためのいくつかのポインター:

他の人ができるだけ読みやすいようにデータを作成します。 dput(head(your_data))それを行うための良い方法です。また、データはデータフレームではなくマトリックスにあるため、最も制限の少ないデータ型が文字であり、すべてのデータが文字です。データ型が混在しているため、ここでは data.frame として保存する方が良いと思います。そのため、すぐにデータをデータフレームとして読み取り、距離列が数値であることを確認しました。

dat <- read.table(text='
name      distance number
"apple"   "2.5"    "4"   
"banana"  "3"      "6"   
"apple"   "1"      "2"   
"satsuma" "4"      "8"   
"satsuma" "7.5"    "1"   
"melon"   "3"      "3"   
"satsuma" "1"      "6"', header=T)  

dat$distance <- as.numeric(dat$distance)


#split by grouping variable
splitdat <- split(dat, dat$name)

#find the minimum distance and index that 
out <- lapply(splitdat, function(x) {
    x[which.min(x$distance), ]
})

#put it all back together as a data frame
data.frame(do.call(rbind, out), row.names=NULL)

これは多くのアプローチの 1 つです。

于 2013-04-03T16:46:32.977 に答える