Условный оператор в пределах l oop с использованием нескольких наборов данных R - PullRequest
1 голос
/ 18 февраля 2020

Я хотел бы выяснить, кто был самым последним предыдущим владельцем в местоположении за последние два года до текущего владельца. Местоположения называются reflo (справочное местоположение). Обратите внимание, что не всегда точное совпадение для reflo.x и reflo в течение двух лет (поэтому решение, которое позволяет мне добавить дополнительные условия, например, найти следующий ближайший reflo, было бы очень полезно ).

Условия:

  • предыдущий владелец должен был проживать в том же месте (lifetime_census$reflo==owners$reflo.x[i]) в течение двух лет после год текущего владельца (lifetime_census$census_year <= 2 года из <code>owners$spr_census)
  • , если его нет, тогда присвойте NA

Предыдущие владельцы (> 20 000) хранятся в наборе данных называется lifetime_census. Вот пример данных:

id    previous_id      reflo  census_year 
16161 5587            -310     2001   
17723 5587            -310     2002      
19345 5879            -310     2003    
16848 5101             Q1      2001         
17836 6501             Q1      2002      
19439 6501             Q1      2003      
21815 6057             Q1      2004       

У меня есть owners набор данных (вот пример):

squirrel_id spr_census reflo.x 
6391        2005        Q1 
6130        2005       -310
6288        2005        A12

Чтобы проиллюстрировать то, что я пытаюсь для достижения:

squirrel_id spr_census reflo.x  previous_owner  census_year
6391              2005  Q1      6057            2004
6130              2005 -310     5879            2003
6288              2005  A12     NA              NA

В настоящее время я пробовал следующее:

n <- length(owners$squirrel_id)

for(i in 1:n) {
  last_owner <- subset(lifetime_census,
    life_census$previous_id!=owners$squirrel_id[i] & #previous owner != current owner
    lifetime_census$reflo==owners$reflo.x[i] &
    lifetime_census$census_year<=owners$spr_census[i])  #owners can be in current or past year

    #Put it all together
    owners[i,"spring_owner"] <- last_owner$previous_id[i]
}

Это дает мне новый столбец для предыдущего владельца в any прошлый год для reflo.x, добавив НС после того, как все условия не будут выполнены. Я не могу понять, как ограничить этот поиск последними двумя годами.

Есть идеи? ( Обратите внимание, что не всегда точное совпадение для reflo.x и reflo в течение двух лет (поэтому решение, позволяющее мне добавить дополнительные условия, например, найти следующий ближайший reflo, будет полезно). )

1 Ответ

0 голосов
/ 20 февраля 2020

Чтобы выяснить, кто был последним предыдущим владельцем в местоположении за последние два года до текущего владельца, вы можете сначала упорядочить по дате в порядке убывания :

library(dplyr)
lifetime_census<-lifetime_census %>% 
       group_by(reflo) %>%  
       arrange(desc(census_date))

Который ставит на первое место самые последние годы (аналогично top_n):

id    previous_owner   reflo  census_year 
19345 5879            -310     2003  
17723 5587            -310     2002      
16161 5587            -310     2001   
21815 6057             Q1      2004 
19439 6501             Q1      2003      
17836 6501             Q1      2002      
16848 5101             Q1      2001 

Затем вы можете запустить l oop выше:

n <- length(owners$squirrel_id)

for(i in 1:n) {
  last_owner <- subset(lifetime_census,
    life_census$squirrel_id != owners$squirrel_id[i] & 
    lifetime_census$reflo==owners$reflo.x[i] &
    lifetime_census$census_year <= owners$spr_census[i])  #owners can be in current or past year

    #Put it all together
    owners[i,"previous_owner"] <- last_owner$previous_owner[i]
    owners[i,"prev_census"] <- last_owner$census_year[i]
}

Это даст вам:

> head(owners)

> squirrel_id spr_census reflo.x  previous_owner  prev_census
  <chr>       <chr>      <chr>    <chr>           <dbl>
  6391        2005       Q1       6057            2004
  6130        2005       -310     5879            2003
  6288        2005       A12      <NA>            <NA>

Если, например, у человека, указанного выше, было совпадение в течение года <= 2 лет от года <code>spr_census, это можно исправить в каждом конкретном случае (не самое элегантное решение, но это выполнимо) используя оператор if_else, например:

owners<-owners%>% mutate(spring_owner=ifelse(prev_census < 2003, "<NA>", spring_owner))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...