>

종단 데이터가있는 긴 형식의 데이터 세트가 있고 하나의 변수에 대해 시점 1의 누락 값을 시점 1의 값으로 채우고 싶지만 시점 1의 누락을 시점의 값으로 채우고 싶지 않습니다. 2 등등. 내 데이터 세트는 id와 시간대로 정렬됩니다.

특정 ID의 모든 시점에서 누락 된 부분을 채워야하는 경우 채우기 기능을 성공적으로 사용했습니다.

데이터 프레임 예 :

df <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4),
                 timepoint=c(0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3),
                 var1=c(NA,9,8,10, NA, 10, NA, 12, NA, NA, 12, 11, NA, 12, 12, NA))
> df
   id timepoint var1
1   1         0   NA
2   1         1    9
3   1         2    8
4   1         3   10
5   2         0   NA
6   2         1   10
7   2         2   NA
8   2         3   12
9   3         0   NA
10  3         1   NA
11  3         2   12
12  3         3   11
13  4         0   NA
14  4         1   12
15  4         2   12
16  4         3   NA

이 시점에 상관없이 누락 된 부분을 채워야 할 때 작동합니다.

library(dplyr)
library(tidyr)
df <- df %>%
  group_by(id) %>% 
  fill(`var9`:`var12`, .direction = "up") %>%
  as.data.frame

그러나 시점 0에서 누락 된 행만 채우도록 지정하는 데 문제가 있습니다. 도움을 주시면 감사하겠습니다.

예상되는 출력 :

> df
   id timepoint var1
1   1         0    9
2   1         1    9
3   1         2    8
4   1         3   10
5   2         0   10
6   2         1   10
7   2         2   NA
8   2         3   12
9   3         0   NA
10  3         1   NA
11  3         2   12
12  3         3   11
13  4         0   12
14  4         1   12
15  4         2   12
16  4         3   NA

  • 답변 # 1

    우리는 group_by 할 수있다  와이즈 비즈   id 를 사용하십시오.   replace 에서 값을 변경하려면  & timepoint = 0   var1 입니다  해당 NA 값에서  어디 var1  각 그룹에서.

    timepoint = 1
    
    

  • 답변 # 2

    이것은 지나치게 단순화 된 것일 수도 있지만 library(dplyr) df %>% group_by(id) %>% mutate(var2 = replace(var1, timepoint == 0 & is.na(var1), var1[timepoint == 1])) # id timepoint var1 var2 # <dbl> <dbl> <dbl> <dbl> # 1 1 0 NA 9 # 2 1 1 9 9 # 3 1 2 8 8 # 4 1 3 10 10 # 5 2 0 NA 10 # 6 2 1 10 10 # 7 2 2 NA NA # 8 2 3 12 12 # 9 3 0 NA NA #10 3 1 NA NA #11 3 2 12 12 #12 3 3 11 11 #13 4 0 NA 12 #14 4 1 12 12 #15 4 2 12 12 #16 4 3 NA NA 에 전화하면됩니다.  다시 기능하지만 이번에는 방향이 아래로 내려갑니다. 그러면 전체 데이터 프레임이 완료됩니다.

    fill
    
    

    이 경우 df <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), timepoint=c(0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3), var1=c(NA,9,8,10, NA, 10, NA, 12, NA, NA, 12, 11, NA, 12, 12, NA)) 를 사용합니다  성명서 뒤에 ifelse  기능.

    lead
    
    

    수율 :

    library(dplyr); library(tidyr);
    df %>% 
      group_by(id) %>% 
      mutate(var1 = ifelse(is.na(var1) & timepoint == 0, 
                           lead(var1, 1), var1))
    
    
    

    # A tibble: 16 x 3 # Groups: id [4] id timepoint var1 <dbl> <dbl> <dbl> 1 1 0 9 2 1 1 9 3 1 2 8 4 1 3 10 5 2 0 10 6 2 1 10 7 2 2 NA 8 2 3 12 9 3 0 NA 10 3 1 NA 11 3 2 12 12 3 3 11 13 4 0 12 14 4 1 12 15 4 2 12 16 4 3 NA

  • 이전 Firebase Firestore에서 고유 한 사용자 ID 시행
  • 다음 wordpress - WooCommerce에 대한 functionsphp를 사용하여 특정 제품의 현재 재고를 얻으려면 어떻게해야합니까?