1. ホーム
  2. r

[解決済み] Rデータフレームで、特定の条件を満たす最初の行を選択するにはどうすればよいですか?

2022-03-10 02:08:55

質問

Rデータフレームで、ある条件を満たす最初の行を選択するにはどうすればよいですか?

以下はその状況です。

5つの列を持つデータフレームがあります。

"pixel", "year","propvar", "component", "cumsum." 

の組み合わせは1,225通りあります。 pixelyear というのも、このデータは25年ごとに49の地理的ピクセルの年次時系列から計算されたものだからである。各ピクセル年において、私は propvar ある画素年の時系列に対して高速フーリエ変換のある成分で説明される全分散の割合である。次に cumsum の累積和である。 propvar を、1ピクセル年内の各周波数成分について計算した。そのため component 列は、フーリエ級数成分(プラス1)のインデックスを与えるだけで、そこから propvar が計算されました。

分散の99%以上を説明するために必要な成分の数を決定したい。これを行う1つの方法は、各ピクセル年での最初の行を見つけることだと思います。 cumsum 0.99とし、3列のデータフレームを作成します。 pixel , year および numbercomps ここで numbercomps は、分散の99%以上を説明するために必要な、任意のピクセル年内の成分の数です。Rでこれを行う方法がわかりません。どなたか解決策をお持ちですか?

どのように解決するのですか?

もちろん、こんな感じでいいと思います。

# CREATE A REPRODUCIBLE EXAMPLE!
df <- data.frame(year = c("2001", "2003", "2001", "2003", "2003"),
                 pixel = c("a", "b", "a", "b", "a"), 
                 cumsum = c(99, 99, 98, 99, 99),
                 numbercomps=1:5)
df
#   year pixel cumsum numbercomps
# 1 2001     a     99           1
# 2 2003     b     99           2 
# 3 2001     a     98           3
# 4 2003     b     99           4
# 5 2003     a     99           5

# EXTRACT THE SUBSET YOU'D LIKE.
res <- subset(df, cumsum>=99)
res <- subset(res, 
              subset = !duplicated(res[c("year", "pixel")]),
              select = c("pixel", "year", "numbercomps"))
#   pixel year numbercomps
# 1     a 2001           1
# 2     b 2003           2
# 5     a 2003           5

EDIT また、ご興味のある方は data.table は、こんなのもあります。

library(data.table)
dt <- data.table(df, key="pixel, year")    
dt[cumsum>=99, .SD[1], by=key(dt)]