Выбор идентификаторов с указанными атрибутами столбца - PullRequest
4 голосов
/ 25 октября 2011

Данные, в которых я пытаюсь сделать свой выбор, выглядят как

   ID Field  Rank
8    6 Other  Prof
9    6 Other  Prof
13   7 Other Assoc
16   7 Other Assoc
17   7 Other  Prof
18   8 Other Assoc
19   8 Other Assoc
22   9 Other Assoc
23   9 Other Assoc
24   9 Other  Prof

Я пытаюсь создать новую переменную, которая содержит все строки людей (ID), которые были повышены с 'Assoc' до 'Prof'. Например, я хотел бы, чтобы моя новая переменная выглядела как

   ID Field  Rank
13   7 Other Assoc
16   7 Other Assoc
17   7 Other  Prof
22   9 Other Assoc
23   9 Other Assoc
24   9 Other  Prof

Я попробовал функцию подмножества, но безуспешно.

Есть ли в R функция, которая может это сделать? Если нет, как это может быть достигнуто.

РЕДАКТИРОВАТЬ: здесь результат от dput(). Примечание. Я пропустил переменную «Поле», поскольку в этом примере она не содержит никакой информации.

 df.promotion <- structure(list(id = c(6, 6, 7, 7, 7, 8, 8, 9, 9, 9), rank = structure(c(2L, 
 2L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L), .Label = c("Assoc", "Prof"
 ), class = "factor")), .Names = c("id", "rank"), row.names = c(NA, 
 -10L), class = "data.frame")

Ответы [ 4 ]

4 голосов
/ 25 октября 2011

Вы можете использовать xtabs для табулирования ваших данных по ID и Rank:

tab <- xtabs(~ID+Rank,dfr)
tab
   Rank
ID  Assoc Prof
  6     0    2
  7     2    1
  8     2    0
  9     2    1

Вам нужны те, в которых ноль не встречается:

subset(dfr,ID %in% rownames(tab[as.logical(apply(tab,1,prod)),]))
   ID Field  Rank
13  7 Other Assoc
16  7 Other Assoc
17  7 Other  Prof
22  9 Other Assoc
23  9 Other Assoc
24  9 Other  Prof
2 голосов
/ 25 октября 2011

Вот довольно простой для понимания подход, который использует вашу первую склонность, чтобы сделать это, используя subset():

Я создаю p, что является id каждого, кто является Проф. Тогда я создаю a который является каждым, кто является партнером.Затем, используя %in%, мы выбираем всех, кто был одновременно Асс и Профессором. Это дает мне набор ключей, которые я затем могу использовать для подстановки исходного data.frame.

p <- unique(subset(df.promotion, rank=="Prof")$id)
a <- unique(subset(df.promotion, rank=="Assoc")$id)

mySet <- a[a %in% p]
subset(df.promotion, id %in% mySet)
1 голос
/ 26 октября 2011

Вот один обычный лайнер, использующий plyr. Код работает путем (а) разбиения фрейма данных по идентификатору и (б) выбора только тех subsets с более чем 1 уникальным рангом (который является прокси для продвижения)

require(plyr)
ddply(df.promotion, .(id), subset, length(unique(rank)) > 1)
1 голос
/ 25 октября 2011

Давайте сделаем это с базой R (хотя plyr манит): Редактировать адаптировано + протестировано для недавно предоставленного dput выхода ...

dfr<-df.promotion #just so I don't have to change too much below
colnames(dfr)<-c("ID", "Rank") #just so I don't have to change too much below
promotedIDs<-unique(dfr$ID)[sapply(unique(dfr$ID), function(curID){
  hasBoth<-(sum(is.na(match(c("Assoc", "Prof"), dfr$Rank[dfr$ID==curID]))) == 0)
})]
result<-dfr[dfr$ID %in% promotedIDs,]

Я проверяю, с помощью match, есть ли "Prof" и "Assoc" в списке рангов для каждого идентификатора. Обратите внимание, что match возвращает NA, если значение не найдено, поэтому подсчет числа NA s является способом выяснить, совпадают ли оба.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...