2010-01-23 3 views
10

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

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

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

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

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

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

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

Любые мысли будут восприняты.

+3

Возможно, вы использовали подмножество (данные, данные [, 2] == "Название компании 09" | данные [, 2] == "Company Name", drop = T) –

+0

Синтаксис, мой худший враг. Спасибо Джонатан. Это именно то, что я пытался сделать. –

ответ

14

Прежде всего (как сделал Джонатан в своем комментарии), чтобы ссылаться на вторую колонку, вы должны использовать либо 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 для матча.

+0

Спасибо Marek, второе решение намного чище и упрощает код. grepl не находится в моих документах при поиске строки. –

+0

Весело благодарен Мареку, даже не знал, что подмножество принимает '% in%'. Это экономит много громоздких/подверженных ошибкам наборов с предложениями OR. +1 !! мой ответ недели до сих пор! –

+1

Что делать, если имя столбца имеет пробел? например, «Название компании». Можем ли мы использовать подмножество – RockScience

5

Пара вещей:

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> 

вы также можете иметь заменить столбец имя с regexp'ed в ЛУЭ.

+0

Джонатан дал мне ответ, который я искал в комментарии выше. Но ваш пост решает другую аналогичную проблему, которую я испытывал. Спасибо Дирк. –

+0

Мое удовольствие - рад, что это помогло. –