>

그래서 다음과 같은 데이터 세트가 있습니다 :

     site year territories cat
1      10 2017         0.0   1
2      10 2016          NA   NA
3      10 2015         2.0   1
4      10 2014          NA   NA
5      10 2013          NA   NA
6      11 2012          NA   NA
7      11 2011         0.0   2
8      11 2010          NA   NA
9      11 2009         1.0   2

그러나 나는 cat 에 NA를 갖고 싶지 않다  기둥. 대신 같은 사이트 내의 모든 줄이 같은 값의 cat 를 갖기를 원합니다. .

이렇게 :

     site year territories cat
1      10 2017         0.0   1
2      10 2016          NA   1
3      10 2015         2.0   1
4      10 2014          NA   1
5      10 2013          NA   1
6      11 2012          NA   2
7      11 2011         0.0   2
8      11 2010          NA   2
9      11 2009         1.0   2

어떻게 할 수 있을지 아십니까?


  • 답변 # 1

    na.aggregate 사용   ave 를 사용하여 NA 값을 채우려면   site 에 의해 그것을 .

    library(zoo)
    transform(DF, cat = ave(cat, site, FUN = na.aggregate))
    
    

    주는 :

     site year territories cat
    1   10 2017           0   1
    2   10 2016          NA   1
    3   10 2015           2   1
    4   10 2014          NA   1
    5   10 2013          NA   1
    6   11 2012          NA   2
    7   11 2011           0   2
    8   11 2010          NA   2
    9   11 2009           1   2
    
    
    참고

    재생 가능한 형식으로 사용 된 입력은 다음과 같습니다.

    Lines <- "
          site year territories cat
    1      10 2017         0.0   1
    2      10 2016          NA   NA
    3      10 2015         2.0   1
    4      10 2014          NA   NA
    5      10 2013          NA   NA
    6      11 2012          NA   NA
    7      11 2011         0.0   2
    8      11 2010          NA   NA
    9      11 2009         1.0   2"
    DF <- read.table(text = Lines)
    
    

  • 답변 # 2

    완전한 기본 R 대안 :

    transform(DF, cat = ave(cat, site, FUN = function(x) x[!is.na(x)][1]))
    
    

    다음을 제공합니다 :

    와이즈 비즈 와이즈 비즈

    로 구현 된 동일한 논리
    :

     site year territories cat
    1   10 2017           0   1
    2   10 2016          NA   1
    3   10 2015           2   1
    4   10 2014          NA   1
    5   10 2013          NA   1
    6   11 2012          NA   2
    7   11 2011           0   2
    8   11 2010          NA   2
    9   11 2009           1   2
    
    
    <시간>

    또는 dplyr   library(dplyr) DF %>% group_by(site) %>% mutate(cat = na.omit(cat)[1]) 의 패키지 :

    na.locf
    
    
    <시간>

    또는 zoo   library(zoo) transform(DF, cat = ave(cat, site, FUN = function(x) na.locf(na.locf(x, fromLast = TRUE, na.rm = FALSE)))) 에서 :

    fill
    
    
    <시간>

    참고 : 부가 가치가 tidyr 의 가치가 무엇인지 궁금합니다. library(tidyr) library(dplyr) DF %>% group_by(site) %>% fill(cat) %>% fill(cat, .direction = "up") 의 열  각 cat 에 대해 동일해야합니다 . 정확히 동일한 두 개의 그룹화 변수가 생겨 중복되는 imo를 만들 수 있습니다.

  • 답변 # 3

    cat 를 사용할 수도 있습니다

    site
    
    
    tidyr::fill

관련 자료

  • 이전 android - gmsgoogleservices와 comgooglefirebase - firebase-storage : 1180의 gradle 충돌
  • 다음 c++ - unique_ptr에 파생 클래스에 대한 사용자 정의 생성자가 표시되지 않습니다