копирование / перетаскивание адреса во все ячейки в R-кадре данных - PullRequest
0 голосов
/ 21 марта 2020

У меня есть данные о собственности за несколько лет. Тем не менее, у меня есть только адрес имущества в данных с 2007 года. Я хочу скопировать / перетащить адрес свойства (согласно номеру свойства) во все записи до 2007 года.

Пример данных ниже

structure(list(year = c(1990L, 1992L, 1998L, 1999L, 2000L, 2001L, 
2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 
2011L, 2012L, 2013L, 2014L, 2015L, 1990L, 1992L, 1998L, 1999L, 
2000L, 2001L, 2002L, 2003L, 2004L, 2005L), property = c("1182 047", 
"1182 047", "1182 047", "1182 047", "1182 047", "1182 047", "1182 047", 
"1182 047", "1182 047", "1182 047", "1182 047", "1182 047", "1182 047", 
"1182 047", "1182 047", "1182 047", "1182 047", "1182 047", "1182 047", 
"1182 047", "5421 047", "5421 047", "5421 047", "5421 047", "5421 047", 
"5421 047", "5421 047", "5421 047", "5421 047", "5421 047"), 
    street = c("", "", "", "", "", "", "", "", "", "", "", "", 
    "400 MINER RD", "400 MINER RD", "400 MINER RD", "400 MINER RD", 
    "400 MINER RD", "400 MINER RD", "400 MINER RD", "400 MINER RD", 
    "", "", "", "", "", "", "", "", "", ""), city = c("", "", 
    "", "", "", "", "", "", "", "", "", "", "ORINDA CA", "ORINDA CA", 
    "ORINDA CA", "ORINDA CA", "ORINDA CA", "ORINDA CA", "ORINDA CA", 
    "ORINDA CA", "", "", "", "", "", "", "", "", "", ""), city_overflow = c("", 
    "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", 
    "", "", "", "", "", "", "", "", "", "", "", "", "", ""), 
    zip = c("", "", "", "", "", "", "", "", "", "", "", "", "94563", 
    "94563", "94563", "94563", "94563", "94563", "94563", "94563", 
    "", "", "", "", "", "", "", "", "", ""), name = c("BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", "BARSAMIAN BETSY A", 
    "BARSAMIAN BETSY A", "ZHANG ZHI HAO & JIANG JIE YING", "ZHANG ZHI HAO & JIANG JIE YING", 
    "ZHANG ZHI HAO & JIANG JIE YING", "ZHANG ZHI HAO & JIANG JIE YING", 
    "ZHANG ZHI HAO & JIANG JIE YING", "ZHANG ZHI HAO & JIANG JIE YING", 
    "ZHANG ZHI HAO & JIANG JIE YING", "ZHANG ZHI HAO & JIANG JIE YING", 
    "ZHANG ZHI HAO & JIANG JIE YING", "ZHANG ZHI HAO & JIANG JIE YING"
    ), period = c("0000", "0000", "0000", "0000", "0000", "0106", 
    "0106", "0106", "0106", "0106", "0106", "0709", "0709", "0709", 
    "1014", "1014", "1014", "1014", "1014", "1500", "0000", "0000", 
    "0000", "0000", "0000", "0106", "0106", "0106", "0106", "0106"
    ), type = c("individual", "individual", "individual", "individual", 
    "individual", "individual", "individual", "individual", "individual", 
    "individual", "individual", "individual", "individual", "individual", 
    "individual", "individual", "individual", "individual", "individual", 
    "individual", "individual", "individual", "individual", "individual", 
    "individual", "individual", "individual", "individual", "individual", 
    "individual")), row.names = c(NA, -30L), class = c("data.table", 
"data.frame"))

Я хочу, чтобы каждая строка содержит адрес, связанный с номером его свойства, который можно найти во всех записях данных после 2007 года.

Ответы [ 2 ]

0 голосов
/ 21 марта 2020

Использование data.table и zoo::na.locf

library(data.table)
#Columns to replace values
cols <- c('street', 'city', 'city_overflow', 'zip')

#Replace empty values with NA
df[, (cols) := replace(.SD, .SD == '', NA), .SDcols = cols]
#Replace NA's values with next values. 
df[,(cols) := lapply(.SD, zoo::na.locf, fromLast = TRUE),.SDcols = cols, property]
0 голосов
/ 21 марта 2020

Использование tidyr::fill() было бы элегантным решением для такого рода проблем. Сначала нужно убедиться, что данные отсортированы по столбцам property и year, для этого работает dplyr::arrange(). Чтобы гарантировать, что адресные данные никогда не вставляются в ячейки другого свойства, мы используем dplyr::group_by().

library(dplyr, warn.conflicts = FALSE)
library(tidyr)

prop_df %>% 
  arrange(property, -year) %>% 
  group_by(property) %>% 
  mutate_at(vars(street, city, zip), ~ifelse(. == "", NA, .)) %>% 
  fill(street, city, zip) 
#> # A tibble: 30 x 9
#>     year property street    city    city_overflow zip   name      period type   
#>    <int> <chr>    <chr>     <chr>   <chr>         <chr> <chr>     <chr>  <chr>  
#>  1  2015 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1500   indivi…
#>  2  2014 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1014   indivi…
#>  3  2013 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1014   indivi…
#>  4  2012 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1014   indivi…
#>  5  2011 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1014   indivi…
#>  6  2010 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 1014   indivi…
#>  7  2009 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 0709   indivi…
#>  8  2008 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 0709   indivi…
#>  9  2007 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 0709   indivi…
#> 10  2006 1182 047 400 MINE… ORINDA… ""            94563 BARSAMIA… 0106   indivi…
#> # … with 20 more rows

Другой подход может заключаться в том, чтобы сначала создать адресный словарь для каждой свойства, используя dplyr select(), filter() и distinct(), а затем присоедините его обратно к исходному набору данных с помощью full_join().

library(dplyr, warn.conflicts = FALSE)

address_dict <- 
  prop_df %>% 
  select(property, street, city, zip) %>% 
  filter_at(vars(street, city, zip), ~. != "") %>% 
  distinct()

prop_df %>% 
  select(-c(street, city, zip)) %>% 
  full_join(address_dict)
#> Joining, by = "property"
#> # A tibble: 30 x 9
#>     year property city_overflow name       period type     street   city   zip  
#>    <int> <chr>    <chr>         <chr>      <chr>  <chr>    <chr>    <chr>  <chr>
#>  1  1990 1182 047 ""            BARSAMIAN… 0000   individ… 400 MIN… ORIND… 94563
#>  2  1992 1182 047 ""            BARSAMIAN… 0000   individ… 400 MIN… ORIND… 94563
#>  3  1998 1182 047 ""            BARSAMIAN… 0000   individ… 400 MIN… ORIND… 94563
#>  4  1999 1182 047 ""            BARSAMIAN… 0000   individ… 400 MIN… ORIND… 94563
#>  5  2000 1182 047 ""            BARSAMIAN… 0000   individ… 400 MIN… ORIND… 94563
#>  6  2001 1182 047 ""            BARSAMIAN… 0106   individ… 400 MIN… ORIND… 94563
#>  7  2002 1182 047 ""            BARSAMIAN… 0106   individ… 400 MIN… ORIND… 94563
#>  8  2003 1182 047 ""            BARSAMIAN… 0106   individ… 400 MIN… ORIND… 94563
#>  9  2004 1182 047 ""            BARSAMIAN… 0106   individ… 400 MIN… ORIND… 94563
#> 10  2005 1182 047 ""            BARSAMIAN… 0106   individ… 400 MIN… ORIND… 94563
#> # … with 20 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...