Ответ 1
Используйте %in%
:
main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]
Это может быть простой вопрос, но мне все же нужна помощь в использовании 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? Спасибо заранее..:)
Используйте %in%
:
main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]
Если у вас на самом деле есть 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
Реплицируйте свои данные:
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.
Вы также можете использовать 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.