Как удалить строки из data.frame на основе внешнего списка, используя R? - программирование
Подтвердить что ты не робот

Как удалить строки из data.frame на основе внешнего списка, используя R?

Это может быть простой вопрос, но мне все же нужна помощь в использовании 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? Спасибо заранее..:)

4b9b3361

Ответ 1

Используйте %in%:

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]

Ответ 2

Если у вас на самом деле есть data.table (в отличие от data.frame), а ваш data.table имеет key, вы можете использовать инерт не присоединяться

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

Конечно, другие два ответы также будут работать на data.table, но это должно быть более эффективным.


Edit

В соответствии с версией 1.8.3 таблицы данных "!" префикс может использоваться для "не-соединений" (см. NEWS).

dat[!to.remove]
   NAMES AGE LOC
1:  Abid  27 Kar
2:   Sus  28 Kar

Ответ 3

Реплицируйте свои данные:

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

Вот как это работает: используйте комбинацию ! negation и %in% для возврата логического вектора, который указывает строки, которые нужно сохранить:

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

Я помню, как я был удивлен этой конструкцией в первый раз, когда увидел это. Почему !dat$NAMES возвращает что-нибудь полезное? Ну, конечно, понимание состоит в том, что сначала выполняется оценка инфиксного оператора %in%, поэтому ! является просто логическим оператором NOT.

Ответ 4

Вы также можете использовать match, если в вашем файле main_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.