2017-03-09 1 views
0

주택 판매 및 12,000 개의 obs와 20 개의 변수가있는 데이터 프레임이 있습니다. 서로 30 일 이내에 같은 주소와 판매 날짜를 가진 판매를 제거하려고합니다. 그 이유는 데이터의 육안 검사가 서로의 판매가 MLS에 의한 오류를 기록 할 가능성이있는 30 일 이내에 이러한 "중복"판매를 나타냈다는 것입니다. 따라서 회귀 분석에 포함시키지 않았습니다. 판매 일 기준 범위를 만들 때 도움이되는 날짜를 숫자로 남겨 두었습니다. 다음은 내 데이터 프레임의 두 개의 관련 열입니다 : 내가 서로 30 일 이내에 판매 날짜가 모든 중복 주소를 찾은 다음 데이터 프레임R - 데이터 프레임의 두 가지 기준에 따라 행 제거

그래서에서 제거하는 것을 시도하고있다

Address  SellingDat 
120 N.Main 41540 
305 S.Hill 42530 
2243 Ridge 40002 
120 N.Main 41530 

지금까지 다음을 사용해 보았지만 고유 한 값을 가진 새로운 데이터 프레임을 만드는 기본적인 아이디어 이외에 무엇을하고 있는지 완전히 이해하지 못했습니다.

data2 <- ddply(data, .(Address, SellingDat), unique) 

어떤 조언이나 조언을 주시면 감사하겠습니다. 이 문제와 관련된 토론을 읽었으나 지금하고있는 일을 기반으로 적용 방법을 알아낼 수있는 것을 찾지 못했습니다. 저는 R의 초보자입니다. 무엇보다 코드가 어떻게 작동하는지 배우고 싶습니다. 작동하는 코드 조각을 가지고있는 것이 아닙니다. 고맙습니다!

+1

좀 더 구체적으로 설명해야한다고 생각합니다. "데이터 프레임에서 제거하십시오"라고 말하면됩니다 - 둘 다 제거하거나 보관 하시겠습니까? 하나만 지키면 어떤 거요? 단일 주소에 20 일 간격으로 3 개의 판매 날짜가있는 경우 - 첫 번째 주소가 40 일 후에도 마지막 주소를 삭제 하시겠습니까? – Gregor

+0

이 정보가 도움이되기를 바랍니다. 모든 행을 삭제합니다. 하나의 주소에는 판매 (행)가 여러 개가 있고 판매 날짜 (열)는 자체 판매일 중 다른 날짜보다 30 일 이내에 있습니다. 신뢰할 수없는 관측으로 간주되기 때문에 두 행 중 하나를 유지하고 싶지 않습니다. 3 판매 날짜 시나리오에 응답하려면 기준이 "다른 판매 날짜의 30 일 이내에"있기 때문에 모두 3을 제거하십시오. 네가 거기에 무엇을 얻었는지 이해하지만 내 경우에는 걱정이되지 않을 것이다. 감사합니다 – JustinS

+0

이것은 더 큰 코드의 작은 조각 일뿐입니다. 데이터 세트의 목적은 데이터 세트에서 "인간"오류를 확인하는 "광범위한"획입니다. 시각적으로 데이터를 살펴볼 때이 작업을 수행해야한다는 것을 알게되었습니다. 한 집의 판매 가격, 침실 수 또는 욕실 수는 각 판매 기록간에 크게 다른 한 달 안에 3 개 항목을 가질 수 있습니다. – JustinS

답변

0

내 의견에 대한 귀하의 답변은 매우 쉽습니다. 여기에 몇 가지 약간 큰 샘플 데이터는 다음과 같습니다

data = data.frame(
    Address = c('a', 'b', 'b', 'b', 'b', 'c', 'c', 'd', 'd'), 
    SellingDat = c(1, 1, 10, 50, 90, 10, 20, 1, 100) 
) 
data 
# Address SellingDat 
# 1  a   1 
# 2  b   1 
# 3  b   10 
# 4  b   50 
# 5  b   90 
# 6  c   10 
# 7  c   20 
# 8  d   1 
# 9  d  100 

그런 다음 우리가 주소에 의해 계산하는 dplyr를 사용하여, 이전부터하고 다음 판매 날짜의 차이. 그런 다음 이전 및 다음 판매 날짜가 30 일 이상 떨어진 행만 유지하도록 필터링합니다.

library(dplyr) 

data %>% group_by(Address) %>% 
    arrange(SellingDat) %>% 
    mutate(time_to_next = c(diff(SellingDat), NA), 
      time_from_last = c(NA, diff(SellingDat))) %>% 
    filter(coalesce(time_to_next, Inf) > 30 & coalesce(time_from_last, Inf) > 30) %>% 
    select(-time_to_next, -time_from_last) %>% 
    arrange(Address, SellingDat) 
# Source: local data frame [5 x 2] 
# Groups: Address [3] 
# 
# Address SellingDat 
# <fctr>  <dbl> 
# 1  a   1 
# 2  b   50 
# 3  b   90 
# 4  d   1 
# 5  d  100 

합체가 누락 된 값으로 대체, 그래서 나는 확실히 누락 된 값을 유지하기 위해 Inf로 뭉쳤다.

+0

감사합니다! 나는 너의 시간과 설명에 매우 감사한다. – JustinS

관련 문제