0

たくさんの日付を含むデータフレーム(データ)があります。1970年以前からすべてを削除したいと思います。1970年以前のインデックスのリストを作成できます。

tmp <- which(data$data < '1970-01-01')
[1]  13446 102876 141199

そして、これらの3つの行を削除する新しいテーブルを作成したいと思います。何かのようなもの:

data.after.1970 <- data[!tmp, ]

私は、 1970年以降のすべての事件のベクトルを作成し、それと照合できることを知っています。

tmp <- which(data$data > '1970-01-01')
data.after.1970 <- data[tmp, ]

しかし、アイテムを除外するためにどの構文を使用するのか疑問に思っています。

アップデート

私はついにこれをしました:

tmp <- which(data$data > as.Date('1970-01-01'))
data.after.1970 <- data[tmp, ]

そしてそれを詳しく調べました。which(data$data < as.Date('1970-01-01'))3つの結果が得られますが、nrow(data) - nrow(data.after.1970)45行を削除したことを示しています。summary(datae$date)それをクリアしました:

summary(data$date)
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max.         NA's 
"1933-07-01" "1989-01-25" "1992-07-09" "1992-05-03" "1996-06-10" "2006-09-14"         "42" 

私の目標は2番目のデータセットを取得して、日付の悪いデータセットを除外した場合に結果を比較できるようにすることだったので、実際にはNA値のデータセットも削除したいと思います。

数値ベクトルを含めるのではなく除外するために使用する構文を知りたいのですが

4

3 に答える 3

5

which論理式の評価または論理ベクトル自体でTRUEである項目の数値ベクトルを返します。負のインデックスを使用してアイテムを削除することもできます。あなたの場合、それは次のようになります:

tmp <- data[ which(data$data < '1970-01-01') ,  ] 

つまり、「data」列が「1970-01-01」よりも小さいデータフレーム「data」のすべての行を返します。あなたは本当に「データ」よりも具体的な名前を使うことを学ぶべきです。オブジェクトとそのオブジェクトの要素に同じ名前を付けることで混乱を招くだけでなく、関数「データ」もあります。では、貧しい聴衆は、10か月前のコードよりも、あなたが書いたときにあなたが何を意味していたかをどのように知っているはずです。

の使用が気に入らない上記の否定的なwhich発言者に対処するために、「[」関数が条件がTRUEまたはNAのいずれかであるすべての行を返すという問題を回避すると答えます。同じ利点があるものを使用できますsubsetが、プログラミングでの使用はお勧めしません。インタラクティブな使用のみを目的としています。サブセットと同じ方法で実行し、NA値を削除する句を追加できます。

tmp <- data[ data$data < '1970-01-01 & !is.na(data$data) , ]

...そして私は使用しているバージョンwhichがその代替案よりも「クリーン」であると主張します。which値がTRUEでなく、負のインデックスを使用している場合に発生する欠点があります。この場合、期待に反して、使用dfrm[-which(condition) , ]すると必要なものが得られず、空のベクトルが得られます。したがって、ルールは次のとおりwhichです。負のインデックスを使用することはできますが、使用しないでください。

于 2012-11-29T23:49:25.490 に答える
1

もう少し説明すると、実行する場合:

data$date > '1970-01-01'

TRUE/FALSE必要な行を選択するために使用できる論理ベクトルが返されることがわかります。この例のように機能します。

test <- 1:3
test[c(TRUE,FALSE,TRUE)]
# result
[1] 1 3

@DWinが彼の回答で指摘しているように、値がある場合はいくつかの注意点がありNA、値と同様に返されTRUEます。のように:

test <- c(NA,1:3)
test > 2
# result
[1]    NA FALSE FALSE  TRUE
test[test>2]
# result
[1] NA  3

このwhichステートメントは、すべてのTRUEインデックスのみを返すため、NA値の問題を回避できます。

test <- c(NA,1:3)

which(test>2)
# result - the fourth value of test is > 2
[1] 4

> test[4]
# result - return the fourth value of test
[1] 3

test[which(test>2)]
# result - return the fourth value of test as the 
# which statement has identified it is > 2
[1] 3

余談ですが、おそらく実際には次のようなことをする必要があるでしょう。

data$date > as.Date('1970-01-01')

...例を正しく機能させるため。もちろん、これは、列が単なるテキストではなくdate、実際にはオブジェクトでもあることを前提としています。Date

于 2012-11-29T23:52:57.097 に答える
0

それは実際にはかなり単純だったことがわかりました。

data.after.1970 <- data[-tmp, ]

のインデックスに一致する data.after.1970行を除くすべての行を含む新しいフレームを作成します。datatmp

于 2012-12-01T20:11:01.953 に答える