web-dev-qa-db-ja.com

グループの最初の行を返す

IDで構成されるデータフレームがあります。これは、グループ内の各要素で同じであり、2つの日時と、これら2つの間の時間間隔です。 datetimeオブジェクトの1つは、関連するタイムマーカーです。ここで、各グループの最初のエントリで構成されるデータフレームのサブセットを取得したいと思います。エントリ(特に時間間隔)はそのままにしておく必要があります。

私の最初のアプローチは、1。IDと2.関連する日時に従ってフレームをソートすることでした。ただし、新しいグループごとに最初のエントリを返すことができませんでした。

次に、aggregate()関数とddply()関数を調べましたが、時間間隔値に集計関数を適用せずに最初のエントリを返すだけのオプションが両方に見つかりませんでした。 。

これを達成するための(簡単な)方法はありますか?

追加:aggregate()とddply()のメモを追加したので、はっきりしなかったのかもしれません。必ずしも集計する必要はありません。新しい各グループの最初の行が探している行になるようにデータフレームが並べ替えられているという事実を考えると、前の行とは異なるIDを持つ各行のサブセットを返すだけで十分です(新しい各グループの開始行)。

データ例:

structure(list(ID = c(1454L, 1322L, 1454L, 1454L, 1855L, 1669L, 
1727L, 1727L, 1488L), Line = structure(c(2L, 1L, 3L, 1L, 1L, 
1L, 1L, 1L, 1L), .Label = c("A", "B", "C"), class = "factor"), 
    Start = structure(c(1357038060, 1357221074, 1357369644, 1357834170, 
    1357913412, 1358151763, 1358691675, 1358789411, 1359538400
    ), class = c("POSIXct", "POSIXt"), tzone = ""), End = structure(c(1357110430, 
    1357365312, 1357564413, 1358230679, 1357978810, 1358674600, 
    1358853933, 1359531923, 1359568151), class = c("POSIXct", 
    "POSIXt"), tzone = ""), Interval = c(1206.16666666667, 2403.96666666667, 
    3246.15, 6608.48333333333, 1089.96666666667, 8713.95, 2704.3, 
    12375.2, 495.85)), .Names = c("ID", "Line", "Start", "End", 
"Interval"), row.names = c(NA, -9L), class = "data.frame")
8
fr3d-5

サンプルのデータフレームを再現してテストすることで、必要な結果を得る方法を見つけました。

  1. 関連する列(ID、開始)でデータを並べ替える

    ordered_data <- data[order(data$ID, data$Start),]

  2. 新しいIDごとに最初の行を見つけます

    final <- ordered_data[!duplicated(ordered_data$ID),]

17
fr3d-5

データを提供しないため、サンプルデータフレームでベースRを使用する例を次に示します。

df <- data.frame(group=c("a", "b"), value=1:8)
## Order the data frame with the variable of interest
df <- df[order(df$value),]
## Aggregate
aggregate(df, list(df$group), FUN=head, 1)

編集:アナンダがコメントで示唆しているように、次のaggregateへの呼び出しの方が優れています:

aggregate(.~group, df, FUN=head, 1)

plyrを使用したい場合は、aggregateddplyに置き換えることができます。

ddply(df, "group", head, 1)
10
juba