0

5つの列(5〜10)のいずれかにリスト内の要素(keep.list)が含まれ、列のいずれにもkeep.listの要素が含まれていない場合、2つのサブセットをデータにしようとしています。これが私が今のところいるところですが、それを正しくサブセット化することはできません:

test.cols <- c(5:10)
keep.list <- c("dog","cat","mouse","bird")

data.sub.IN <- data.big[which(any(keep.list %in% data.big[test.cols])),]

data.sub.NOT.IN <- data.big[which(any(keep.list !%in% data.big[test.cols])),] 

私は考えwhich()て助けることができますが、私は間違っている可能性があり、通常のコマンドが機能any()していないため、「含まれていない」ケースを処理する方法がわかりません。!

4

2 に答える 2

3

次を使用してこれを行うことができますapply

keep <- apply(data.big[test.cols], 1, function(r) any(r %in% keep.list))
data.sub.IN <- data.big[keep, ]
data.sub.NOT.IN <- data.big[!keep, ]

applyデータ フレームの各行に関数を適用します。この場合、各行について、その行の項目のいずれかが にあるかどうかをチェックしkeep.listます。

于 2013-03-05T02:55:01.960 に答える
1

私は@DavidRobinsonsの答えに行きますが、それをそのままの形で維持したい場合は、!. を否定するには、論理演算子の最初の部分の前に the%in%を置きます。!

B <- 1:4
A <- 3:6
A %in% B
[1]  TRUE  TRUE FALSE FALSE
!A %in% B
[1] FALSE FALSE  TRUE  TRUE

だからあなたの場合:

data.sub.NOT.IN <- data.big[which(any(!keep.list %in% data.big[test.cols])),]

しかし、繰り返しになりますが、この場合は使用applyする方が良いオプションだと思います。

EDIT @DWinのコメントに基づいて、これは機能しない可能性があります(データセットの例がないとわかりにくい)、実際には次のものが必要になる場合があります。

data.sub.NOT.IN <- data.big[which(!any(keep.list %in% data.big[test.cols])),]
于 2013-03-05T03:06:24.580 に答える