R - краткость при подмножестве? - PullRequest
4 голосов
/ 01 июля 2011

Я все еще новичок в R и делаю все мои поднаборы по шаблону:
data [команда, которая выдает логическую длину, равную длине данных]
или
подмножество (данные, команда, которая выдает логическую длину, равную длине данных)

например:

test = c("A", "B","C")
ignore = c("B")
result = test[ !( test %in% ignore ) ]
result = subset( test , !( test %in% ignore ) )

Но я смутно помню из моих чтений, что есть более короткий / (более читаемый?) Способ сделать это? Возможно, используя функцию «с»?

Может ли кто-нибудь перечислить альтернативу приведенному выше примеру, чтобы помочь мне разобраться в параметрах поднабора?

Ответы [ 4 ]

6 голосов
/ 01 июля 2011

Я не знаю более краткого способа поднабора для вашего конкретного примера, используя только векторы. Что касается with, о чем вы можете подумать, так это поднабор фреймов данных на основе условий, использующих столбцы из этого фрейма данных. Например:

dat <- data.frame(variable1 = runif(10), variable2 = letters[1:10])

Если мы хотим получить подмножество dat на основе условия, используя variable1, мы можем сделать это:

dat[dat$variable1 < 0,]

или мы можем избавиться от необходимости каждый раз писать dat$*, используя with:

with(dat,dat[variable1 < 0,])

Теперь вы заметите, что я действительно не сохранял нажатие клавиш, выполнив это в этом случае. Но если у вас есть фрейм данных с длинным именем и сложным условием, это может немного вас спасти. См. Также связанную команду ?within, если вы изменяете рассматриваемый фрейм данных.

В качестве альтернативы, вы можете использовать subset, который может делать то же самое:

subset(dat, variable1 < 0)

subset также может обрабатывать условия для столбцов с помощью аргумента select.

3 голосов
/ 01 июля 2011

Функция with помогла бы, если бы тест представлял собой столбец во фрейме данных (или объект в списке), но с глобальными векторами с не помогает.

Некоторые люди создали оператор not in, который может спасти пару нажатий клавиш от того, что вы сделали. Если все значения в тесте уникальны, то функция setdiff может быть тем, о чем вы думаете (но если, например, у вас было несколько "A" s, то setdiff вернет только 1 из них).

Если вы игнорируете только 1 значение, вы можете использовать test != ignore, но это не обобщает игнорирование наличия 2 или более значений.

2 голосов
/ 01 июля 2011

Я видел временные сравнения альтернативных методов, и% в% (на основе совпадения) был одной из самых эффективных стратегий.

Альтернативы:

test[!test=="B"]   #logical indexing
test[which(test != "B")]  #numeric indexing
  # the which() is not superfluous when there are NA's if you want them ignored
1 голос
/ 17 июня 2015

Еще одна альтернатива оригинальному примеру:

test[test != ignore]

Другие способы, используя пример Джорана:

set.seed(1)
df <- data.frame(variable1 = runif(10), variable2 = letters[1:10])

Возвращение одного столбца: df[[1]]. df $ name равно эквивалентно df [["name", точный = FALSE]]

df[df[[1]] < 0.5, ] 
df[df["variable1"] < 0.5, ] 

Возвращение одного фрейма данных одного столбца: df[1]

df[df[1] < 0.5, ]

Использование with

with(df, df[df[[1]] < 0.5, ]) # One column
with(df, df[df["variable1"] < 0.5, ]) # One column
with(df, df[df[1] < 0.5, ])  # data frame of one column

Использование dplyr:

library(dplyr)
filter(df, variable1 < 0.5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...