3

ID 列、Value 列、および Date 列を含むデータ フレームが与えられた場合、次のことを行いたいと思います: 各 ID (ID でグループ化) に対して、最も高い値を持つ行の日付を返します。

> df <- data.frame(ID=c(101, 101, 101, 202), Date=c("2013-04-12", "2013-06-21", "2013-07-06", "2013-07-06"), Value=c(3.4, 5.8, 4.2, 2.1))
> df
   ID       Date Value
1 101 2013-04-12   3.4
2 101 2013-06-21   5.8
3 101 2013-07-06   4.2
4 202 2013-07-06   2.1

上記のデータ フレームの場合、出力は次のようになります。

   ID       Date
1 101 2013-06-21 # because it has highest Value for ID=101 (i.e., 5.8)
2 202 2013-07-06 # bacause it has highest Value for ID=202 (2.1)

aggregate() を使用して ID で最大値を取得することは知っていますが、実際に集計された max() 値の代わりに Date 列を返すにはどうすればよいですか?

4

3 に答える 3

3

data.tableデータセットが大きい場合の方法は次のとおりです。

library(data.table)
df <- data.table(df)
df[ , Date[which.max(Value)], by=ID]
    ID         V1
1: 101 2013-06-21
2: 202 2013-07-06

データのサイズが適度で、ID 値が多すぎない場合 (> 100 - 500 だと思います)、次のようにすることもできます。

sapply(X=split(df, df$ID),
       FUN=function (k) k$Date[which.max(k$Value)])
       101        202 
2013-06-21 2013-07-06 
于 2013-07-16T21:53:37.200 に答える
1

私が見つけることができる最も簡単な方法は、library(sqldf) を使用して、R で SQL を話すことです。

> library(sqldf)
> sqldf('select * from df group by ID having Value = max(Value)')
    ID     Date    Value
 1 101 2013-06-21   5.8
 2 202 2013-07-06   2.1

Mac に sqldf をインストールするのは少し難しいです。とにかく、R で SQL を話すと、物事がはるかに簡単になります。以下は私の手順です:

  install.packages("sqldf")
  options(gsubfn.engine = "R")
  packageVersion("gsubfn")
  library(RSQLite.extfuns)
  library(DBI)
  library(RSQLite)
  library(proto)
  library(gsubfn)
  library(sqldf)
于 2014-04-12T03:08:06.470 に答える