2016-10-14 4 views
0

데이터 프레임의 다른 열에있는 값과 순차적 조건 비교를 기반으로 값을 생성하는 데 문제가 있습니다. 내가 좋아하는 것이 무엇순차 비교를 기반으로 R 데이터 프레임에 데이터 열 만들기

ID Tracked 

1 Yes 
1 Yes  
1 No  
1 No  
1 Yes  
1 Yes 
2 Yes  
2 No  
2 No  
2 Yes  
2 Yes  
2 Yes  
2 No  
2 Yes 

이 ID 예이 같은 적어도 이전의 연속이 있는지 여부의 기반으로 세 번째 열을 추가하는 것입니다 : 여기

예 데이터입니다.

ID Tracked Seq 

1 Yes  NA  
1 Yes  1  
1 No  0  
1 No  0  
1 Yes  0  
1 Yes  1  
2 Yes  NA  
2 No  0  
2 No  0  
2 Yes  0  
2 Yes  1  
2 Yes  1  
2 No  0  
2 Yes  0 

많은 도움에 감사드립니다. 나는 여러 가지를 시도하고 간단한 코드를 생각해 낼 수 없지만 중첩 된 for 루프를 생성해야하는 것처럼 보입니다.

최신 for 루프 (테스트 당 ID로 루핑하지 않고)가 작동하지 않고 모든 0을 반환했습니다.

for (i in length(Data)){ 
    Data$Seq[i+1] <- ifelse(Data$Tracked[i]==Data$Tracked[i+1], 1, 0) 
} 

그리고

for (i in 1:(nrow(df)-1)){ 
    df$Seq[1] <- NA 
    df$Seq[i+1] <- 
    ifelse(df$Tracked[i]==df$Tracked[i+1], 1, 0) * 
    ifelse(df$ID[i] == df$ID[i+1], 1, NA) 
} 
+0

을 나는 그가 이전의 연속에 의해 바로 위의 행을 의미한다고 생각 . 그게 그의 코드가 어쨌든 제안하는 것입니다 ... – parksw3

+0

@ m0h3n 네, 그게 바로 제가 데이터를 가지고 얻은 것입니다. 고쳐 주셔서 감사합니다. – MikeD

답변

1

parksw3 @의 도움으로 작동하는 솔루션 나는 이것이 당신이 원하는 것을 수행 생각합니다.

df <- read.table(
    text = " 
    ID Tracked 

    1 Yes 
    1 Yes 
    1 No 
    1 No 
    1 Yes 
    1 Yes 
    2 Yes 
    2 No 
    2 No 
    2 Yes 
    2 Yes 
    2 Yes 
    2 No 
    2 Yes", 
    header = TRUE 
) 

tmp 당신에게 대답은 '예인지 여부를 알려주는 TRUE/FALSE 벡터를 제공합니다. tmp2NA을 처음에 추가하고 마지막 요소를 제거하여 이전 대답이 예 (yes)인지 아닌지를 알려주는 TRUE/FALSE 벡터를 제공합니다. 이전 응답과 현재 응답이 모두 예이면 2를 곱하면 1이 반환되고 그렇지 않은 경우 0이 반환됩니다.

는 결과
dftmp <- aggregate(.~ID, df, 
    FUN = function(x){ 
     tmp <- x == 2 ## If you want to use "Yes" instead, replace df with lapply(df, as.character) and replace 2 with "Yes" 
     tmp2 <- c(NA, tmp[-length(tmp)]) 
     tmp * tmp2 
    }) 

df$Seq <- unlist(dftmp[,-1]) 

: 코드를 해결하기 위해, 그것은 다소 실수도

print(df) 
## ID Tracked Seq 
## 1 1  Yes NA 
## 2 1  Yes 1 
## 3 1  No 0 
## 4 1  No 0 
## 5 1  Yes 0 
## 6 1  Yes 1 
## 7 2  Yes NA 
## 8 2  No 0 
## 9 2  No 0 
## 10 2  Yes 0 
## 11 2  Yes 1 
## 12 2  Yes 1 
## 13 2  No 0 
## 14 2  Yes 0 

이다하지만이 작동합니다 : m0h3n @

for (i in 1:(nrow(df)-1)){ 
    df$Seq[i+1] <- 
     ifelse(df$Tracked[i]==df$Tracked[i+1], 1, 0) * 
     ifelse(df$ID[i] == df$ID[i+1], 1, NA) 
} 
+0

'lapply (df, as.character)'를 단지'df'로 대체하고'x == 2'라고 대신 할 수 있습니다. 그래서 당신은 그것을 건너 뛸 수 있습니다. – 989

+0

이 경우에는 괜찮지 만 참고로 일반적으로 다른 사용자가 제안한 개선 사항은 여기에서 언급됩니다. – 989

+0

@ m0h3n 알았어요. 코드를 수정했습니다. 제게 알려 줘서 고마워요. – parksw3

관련 문제