Выберите уникальную комбинацию рабочее место — идентификатор в R

#r #dplyr

#r #dplyr

Вопрос:

Рассмотрим следующее подмножество моего набора данных, состоящее примерно из 22 000 человек.

 df<-data.frame( c("Den Haag", "Den Haag", "Den Haag", "Rotterdam", "Den Haag",
                  "Den Haag", "Amsterdam"),
                c("R007", "R007", "R008", "R008", "R008", "R009", "R009"), 
                c(20130101, 20140101 ,20130101, 20130101, 20140101, 20130101, 20140101), 
                c(40000,42000,22000,20000,38000,10000, 15000))

colnames(df)<-c("Gemeente", "id", "Date", "income")

df$Date<-as.character(df$Date)
df$Date<-as.Date(df$Date, "%Y%m%d")

  

В приведенном выше наборе данных «Gemeente» обозначает место, где работают люди, а переменная id — это человек. Моя цель — удалить все наблюдения, которые работают более чем на 1 рабочем месте в моей выборке. Не имеет значения, работают ли они на разных рабочих местах в последующие годы (R009) или в том же году (R008). Точнее, я также хочу отказаться от R008 для 2013 и 2014 годов, потому что этот человек работает в двух муниципалитетах в 2013 году. Таким образом, в данном случае это означает, что я удалю оба наблюдения R008 и R009 и оставлю только R007.

Я думал, что мог бы сделать это следующим образом, но я делаю что-то не так с командой unique, которая выбирает все уникальные идентификаторы в образце, в то время как я хочу выбрать только R007. Кто-нибудь знает, какую команду я должен использовать вместо этого?

 #Select unique rows of observations based on muncipality and id
library(dplyr)

#Select all unique combinations of Municipality and ids
test<-distinct(df, Gemeente, id))

#Select the number of unique ids (i.e. drop the ids that work at more than one place in our dataset)
#But here I only want to select id R007, but with this command I select all three. So this is where I go wrong.
test2<-as.data.frame(unique(test$id))
colnames(test2)[1]<-"id"
test2$nr<-1

#Use left_join to the initial dataset. 
dffinal<-left_join(df, test2, by = "id")
dffinal<-subset(dffinal, nr ==1)
  

Я ценю любую помощь.

Ответ №1:

Работает ли это:

 library(dplyr)
df %>% group_by(id) %>% filter(length(unique(Gemeente)) == 1)
# A tibble: 2 x 4
# Groups:   id [1]
  Gemeente id    Date       income
  <fct>    <fct> <date>      <dbl>
1 Den Haag R007  2013-01-01  40000
2 Den Haag R007  2014-01-01  42000
> 
  

Комментарии:

1. n_distinct() является более быстрым и кратким эквивалентом length(unique()) .