2016-02-08 5 views
0

В общем, я знаю, как удалить строки в R. Однако для этого конкретного требования я не уверен, как действовать. Вот идея о том, что мне нужно делать с данными:Удалить определенные строки в R

ID  MONTH INCOME 
1. 00000012 6  60 
2. 00000012 8  65 
3. 00000015 12  70 
4. 00000025 4  45 
5. 00000025 8  60 
6. 00000032 6  10 
7. 00000035 6  30 

Краткое описание каждой колонки:

Первые 7 цифр ID идентификации агента. Таким образом, в первой строке 00000012 означает агент 1. Последняя цифра - номер интервью. Таким образом, в третьем ряду 00000015 означает агент 1, интервью 5.

Месяц и доход просты.

Что должно быть сделано

нужно удалить каждый идентификатор, который не включает в себя как на 2-й и 5-й интервью.

Мне нужно иметь только макс. месяц для второго собеседования и 5-е интервью для каждого удостоверения личности.

Так что, если я очистил данные правильно, я бы:

ID  MONTH INCOME 
2. 00000012 8  65 
3. 00000015 12  70 
6. 00000032 6  10 
7. 00000035 6  30 

Обратите внимание ряд 4,5 ушел, потому что не было никакого второго интервью для агента 2. Ряд 1 ушел, потому что было выше месяц для агента 1, интервью 2.

Мои текущие мысли, как это сделать, кажутся чрезмерно сложными. Я имею в виду разбить ID на две колонки, одну с первыми 7 цифрами, другую колонку с последней цифрой. Затем проведите цикл по всем данным, и в каждой строке запустите другой цикл, чтобы увидеть, соответствует ли идентификатор, соответствующий строке, интервью 2 и интервью 5. Если это так, отлично. Если это не так, я должен удалить все строки с этим идентификатором.

Далее, я должен сделать аналогичную вещь для удаления месяцев без макс.

Я чувствую, что могу сделать выше, но это очень громоздко. Есть лучший способ сделать это? Спасибо.

+0

Разделение это отличная идея, увидеть 'substr'?. Создайте столбец 'agent' и столбец' интервью'. Затем вы должны найти, какие агенты ** делают **, 2-го собеседования, 'agents_with_second = data $ agent [data $ interview == 2]' и фильтровать ваши данные только для этих агентов. 'data = data [data $ agent% in% agents_with_second,]' – Gregor

+0

Спасибо. Разделение также может быть выполнено, если один столбец будет модулем 10 идентификатора, а другой столбец - всего целым числом ID/10. substr тоже может работать. Что после этого? Пробивается ли только один хороший способ? EDIT: Ах, отличная идея. – user43395

+0

Да, это сработает, если ваш идентификатор на самом деле является числовым. Поскольку он начинается с 0, я уверен, у вас есть строка или фактор на ваших руках. Чтобы сделать ваш пример воспроизводимым, включая типы данных, поделитесь своими данными с помощью 'dput (капли (head (data))). (Да, извините, я редактировал, поскольку вы комментировали, по-видимому.) – Gregor

ответ

0

Вы можете сделать что-то подобное:

library(stringi) 
Agents <- substr(df$ID,1,nchar(df$ID)-1) 
A2 <- stri_endswith_fixed(df$ID,"2", fixed = T) 
A5 <- stri_endswith_fixed(df$ID,"5", fixed = T) 
A2and5 <- intersect(Agents[A5], Agents[A2]) 
df[Agents %in% A2and5,] 
+0

Это почти отлично сработало. Последняя строка дает мне проблемы, хотя это делает мой df главным образом крахом. Может быть, просто потому, что A2and5 является символом, но не целочисленным/числовым. Поскольку мой A2and5 в порядке, хотя и прокручивая его, и только хранение данных, где совпадение идентификаторов не будет таким большим, хотя есть, вероятно, более простой способ. – user43395

+0

@ user43395 см. Редактировать – HubertL

+0

Отлично, это сработало! Считаете ли вы, что я должен следовать аналогичному подходу, чтобы получить максимальный результат. месяц? – user43395

Смежные вопросы