Подмножество в R с использованием условия OR со строками - PullRequest
10 голосов
/ 24 января 2010

У меня есть фрейм данных с примерно 40 столбцами, второй столбец data [2] содержит название компании, которое описывает остальная часть данных строки. Тем не менее, названия компаний различаются в зависимости от года (в конце 2009 года данные за 2009 год, ничего за 2010 год).

Я бы хотел иметь возможность подгруппировать данные таким образом, чтобы я мог получать данные за оба года одновременно. Вот пример того, что я пытаюсь сделать ...

subset(data, data[2] == "Company Name 09" | "Company Name", drop = T) 

По сути, мне трудно использовать оператор OR в функции подмножества.

Однако я попробовал другие варианты:

subset(data, data[[2]] == grep("Company Name", data[[2]]))

Возможно, есть более простой способ сделать это, используя строковую функцию?

Любые мысли будут оценены.

Ответы [ 2 ]

16 голосов
/ 24 января 2010

Прежде всего (как Джонатан сделал в своем комментарии), чтобы ссылаться на второй столбец, вы должны использовать либо data[[2]], либо data[,2]. Но если вы используете подмножество, вы можете использовать имя столбца: subset(data, CompanyName == ...).

И для вас вопрос я сделаю одно из:

subset(data, data[[2]] %in% c("Company Name 09", "Company Name"), drop = TRUE) 
subset(data, grepl("^Company Name", data[[2]]), drop = TRUE)

В секунду я использую grepl (введено в версии R 2.9), которые возвращают логический вектор с TRUE для совпадения.

5 голосов
/ 24 января 2010

Пара вещей:

1) Макетные данные полезны, так как мы не знаем точно, с чем вы столкнулись. Пожалуйста, предоставьте данные, если это возможно. Может быть, я неправильно понял, что следует?

2) Не используйте [[2]] для индексации ваших data.frame, я думаю [, "colname"] намного понятнее

3) Если единственным отличием является конечный «09» в названии, то просто отразите это:

R> x1 <- c("foo 09", "bar", "bar 09", "foo")
R> x2 <- gsub(" 09$", "", x1)
[1] "foo" "bar" "bar" "foo"
R> 

Теперь вы сможете создавать подмножество данных, преобразованных на лету:

R> data <- data.frame(value=1:4, name=x1)
R> subset(data, gsub(" 09$", "", name)=="foo")
  value   name
1     1 foo 09
4     4    foo
R> 

Вы также можете заменить столбец name значением regexp.

...