8

data.frame フィルタリングには興味深いオプションがありますdrop = TRUE。次の抜粋を参照してくださいhelp('[.data.frame')

使用法

クラス「data.frame」の S3 メソッド

x[i, j, drop = ]

しかし、data.frame で試してみると、うまくいきません。

> df = data.frame(a = c("europe", "asia", "oceania"), b = c(1, 2, 3))
>
> df[1:2,, drop = TRUE]$a
[1] europe asia  
Levels: asia europe oceania     <--- oceania shouldn't be here!!
>

私は次のような他の方法があることを知っています

df2 <- droplevels(df[1:2,])

しかし、ドキュメントではこれを行うためのはるかにエレガントな方法が約束されているのに、なぜそれが機能しないのでしょうか? バグですか?これがどのように機能するのか理解できないので...

編集:ここでわかるdrop = TRUEように、ベクトルの因子レベルを削除することで混乱しました。因子レベルを下げて下げないのはあまり直感的ではありません!![i, drop = TRUE][i, j, drop = TRUE]

4

4 に答える 4

11

ドキュメントには次のように明確に記載されています。

ドロップ:論理。TRUEの場合、結果は可能な限り低い次元に強制変換されます。デフォルトでは、列が1つだけ残っている場合はドロップしますが、行が1つだけ残っている場合はドロップしません。

これはdrop = TRUE、フィルタリングされdata.frameた結果が単一の列または行になる場合、結果は単一の列/単一の行を返すのではなく、ベクトル/リストに強制変換されることを意味しdata.frameます。

したがって、この引数はレベルの低下とは関係がないため、レベルの超過を排除する正しい方法は、あなたが言及した方法です(つまり、droplevels関数を使用します)。

于 2013-01-02T14:35:16.783 に答える
6

Peter Dalgaardがhttp://www.mail-archive.com/r-help@stat.math.ethz.ch/msg22459.html で説明しているように、これは多くの人にとってつまずきです。以下のdigEmAll。

使用したいものが必要な場合:

d2[] <- lapply(d2, function(x) if (is.factor(x)) factor(x) else x) 
于 2013-01-02T14:34:08.257 に答える
6

ドキュメントが言うことは

TRUE の場合、結果は可能な限り低い次元に強制されます。

したがって、因子レベルではなく、ディメンションに関連しています。

df[, 1]
# [1] europe  asia    oceania
# Levels: asia europe oceania
df[, 1, drop = FALSE]
#         a
# 1  europe
# 2    asia
# 3 oceania

因子レベルの低下は別の問題です。この目的?'[.factor'で引数が表示されるケース ( ) は次のとおりです。drop

ff <- factor(c('AA', 'BA', 'CA'))
ff[1:2, drop = TRUE]
# [1] AA BA
# Levels: AA BA
于 2013-01-02T14:39:16.787 に答える