これは、慎重に使用factor
および設定するのに最適なケースだと思います。この考え方でこちらをlevels
使用します。列が(絶対要件ではありません) であるdata.table
ことを確認してください。value
character
ステップ 1:行だけを取得してdata.frame
変換します。data.table
unique
require(data.table)
dt <- as.data.table(unique(df))
setkey(dt, "depth") # just to be sure before factoring "value"
ステップ 2: a に変換value
し、factor
に強制しnumeric
ます。必ず自分でレベルを設定してください(重要です)。
dt[, id := as.numeric(factor(value, levels = unique(value)))]
depth
ステップ3:サブセット化のためにキー列を設定し、最後の値を選択するだけです
setkey(dt, "depth", "id")
dt.out <- dt[J(unique(depth)), mult="last"][, value := NULL]
# depth id
# 1: 1 2
# 2: 2 2
# 3: 3 3
ステップ 4: 深さが増加する行のすべての値は、少なくとも前の行の値を持つ必要がcummax
あるため、最終的な出力を取得するために使用する必要があります。
dt.out[, id := cummax(id)]
編集:上記のコードは、説明を目的としたものです。実際には、3 列目はまったく必要ありません。これが最終的なコードの書き方です。
require(data.table)
dt <- as.data.table(unique(df))
setkey(dt, "depth")
dt[, value := as.numeric(factor(value, levels = unique(value)))]
setkey(dt, "depth", "value")
dt.out <- dt[J(unique(depth)), mult="last"]
dt.out[, value := cummax(value)]
よりトリッキーな例とコードからの出力を次に示します。
df <- structure(list(depth = c(1, 1, 2, 2, 3, 3, 3, 4, 5, 5, 6),
value = structure(c(1L, 2L, 3L, 4L, 1L, 3L, 4L, 5L, 6L, 1L, 1L),
.Label = c("a", "b", "c", "d", "f", "g"), class = "factor")),
.Names = c("depth", "value"), row.names = c(NA, -11L),
class = "data.frame")
# depth value
# 1: 1 2
# 2: 2 4
# 3: 3 4
# 4: 4 5
# 5: 5 6
# 6: 6 6