32

これは簡単な質問かもしれませんが、R を使用するにはまだ助けが必要です。

私はdata.frame(main_data)を持っています..

NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar

名前のリストに基づいていくつかの行を削除したいと思います。したがって、次のようなテーブルの別のリストがあるとしましょう。

NAMES_list
Jyo
Ras
Poo

したがって、このリストに基づいて、名前のいずれかが上記の「main_data」テーブルと一致する場合、それらを含む行全体を削除したいので、結果は次のようになります

NAMES   AGE     LOC
Abid    27      Kar
Sus     28      Kar

Rを使用してこれを達成する方法を誰か助けてもらえますか? 前もって感謝します.. :)

4

4 に答える 4

55

使用%in%:

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]
于 2012-10-22T13:35:57.770 に答える
13

たまたま、実際にdata.table( a ではなくdata.frame) をdata.table持っていてkey、あなたが を持っている場合は、not join イディオムを使用できます。

library(data.table)
dat <- as.data.table(read.table(text="
NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar", 
stringsAsFactors=FALSE, header=TRUE))

setkey(dat, NAMES)

to.remove <- c("Jyo","Ras","Poo")
dat[-dat[to.remove, which=TRUE]]
#   NAMES AGE LOC
#1:  Abid  27 Kar
#2:   Sus  28 Kar

もちろん、他の2 つの 回答も で機能しdata.tableますが、これはより効率的なはずです。


編集

data.table バージョン 1.8.3 以降、「!」プレフィックスは「非結合」に使用できます ( NEWSを参照)。

dat[!to.remove]
   NAMES AGE LOC
1:  Abid  27 Kar
2:   Sus  28 Kar
于 2012-10-22T14:13:37.720 に答える
9

データを複製します。

dat <- read.table(text="
NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar", 
stringsAsFactors=FALSE, header=TRUE)

remove <- c("Jyo", "Ras", "Poo")

単純なサブセット化:

dat[!dat$NAMES %in% remove, ]
  NAMES AGE LOC
2  Abid  27 Kar
5   Sus  28 Kar

仕組みは次のとおりです:!否定との組み合わせを使用し%in%て、保持する行を示す論理ベクトルを返します。

!dat$NAMES %in% remove
[1] FALSE  TRUE FALSE FALSE  TRUE

初めてこの構造物を見たときは驚いたのを覚えています。!dat$NAMES有用なものを返すのはなぜですか? もちろん、インフィックス演算子%in%が最初に評価されるという洞察があるため、これ!は単なる論理否定演算子です。

于 2012-10-22T13:38:50.547 に答える
1

matchmain_data$NAMES に一意の値がある場合にも使用できます

NAMES_list <- c("Jyo","Ras","Poo")
main_data <- main_data[-match(NAMES_list,main_data$NAMES),]
main_data
  NAMES AGE LOC
2  Abid  27 Kar
5   Sus  28 Kar

NAMES_list と main_data$NAMES が完全に一致する行を削除します。

于 2012-10-23T05:03:28.833 に答える