2013-11-03 2 views
1

내 데이터 세트에는 약 54,000 개의 행이 있습니다. 다른 열의 값과 이전에 다른 열의 값이 표시되었는지 여부에 따라 T 또는 F 중 하나에 값 (First_Pass)을 설정하려고합니다. 나는 그것을하기 위해 필요한 것을 정확히 수행하는 for 루프를 가지고있다. 그러나 해당 루프는 데이터의 하위 집합에만 적용됩니다. 요소 수준에 따라 다른 하위 집합에 대해 루프를 개별적으로 실행해야합니다.은 ddply 내에서 사용자 정의 루프를 작동합니다.

이것은 데이터를 부분 집합으로 나누고 함수 (my for 루프)를 적용한 다음 데이터에 다시 가입시키려는 것처럼 plyr 함수의 완벽한 경우와 같습니다. 그러나, 나는 그것을 작동시킬 수 없습니다. 먼저 char.data라는 df 샘플을 제공합니다.

 session_id list Sent_Order Sentence_ID Cond1 Cond2 Q_ID Was_y CI CI_Delta character tsle tsoc Direct 
5139   2 b   9   25 rc su 25 correct 1  0   T 995 56  R 
5140   2 b   9   25 rc su 25 correct 2  1   h 56 56  R 
5141   2 b   9   25 rc su 25 correct 3  1   e 56 56  R 
5142   2 b   9   25 rc su 25 correct 4  1    56 37  R 

거기에 약간의 혼란이 있습니다. 키 열은 session_id, Sentence_ID, CI 및 CI_Delta입니다.

그때 First_Pass라는 컬럼을 초기화에 "F"

char.data $ First_Pass < - "F"

내가 First_Pass이 SESSION_ID의 각 조합에 대한 사실 "T"인 경우 지금 계산하려면 및 Sentence_ID. 장난감 세트를 만들었는데, 이는 전체 로직을 해결하기위한 하나의 서브 세트 일뿐입니다. 다음은 장난감 데이터에 대해 내가 원하는 것을 제공하는 for 루프의 코드입니다.

char.data.toy$First_Pass <- "F" 
l <-c(200) 
for (i in 1:nrow(char.data.toy)) { 
    if(char.data.toy[i,]$CI_Delta >= 0 & char.data.toy[i,]$CI %nin% l){ 
    char.data.toy[i,]$First_Pass <- "T" 
    l <- c(l,char.data.toy[i,]$CI)} 
} 

이제이 루프를 가져 와서 모든 session_id 및 Sentence_ID 하위 집합에 대해 실행하고 싶습니다. 나는 set_fp라는 함수를 생성하고 그것을 ddply 안에 호출했다. 그 코드는 다음과 같습니다.

#define function 
set_fp <- function (df){ 

    l <- 200 
    for (i in 1:nrow(df)) { 
    if(df[i,]$CI_Delta >= 0 & df[i,]$CI %nin% l){ 
     df[i,]$First_Pass <- "T" 
     l <- c(l,df[i,]$CI)} 
    else df[i,]$First_Pass <- "F" 
    return(df) 
    } 

} 

char.data.fp <- ddply(char.data,c("session_id","Sentence_ID"),function(df)set_fp(df)) 

불행히도, 이것은 옳지 않습니다. 오랫동안 First_Pass의 모든 "F"값을 얻었습니다. 이제 더 많은 시간이 필요할 때 24 T 값을 얻었습니다. 그래서 마지막 서브셋이나 비슷한 것을 유지할 것입니다. 도움?

+0

이 문제가 해결되었을 수도 있습니다. 나는 for 루프 밖에서 리턴을 옮겼고, 지금은 더 합리적인 보이는 답을 리턴하고있다. 모든 데이터를 검토 한 다음 실제로 맞으면 문서화하고 닫습니다. (게시하기 전에 몇 시간 씩 보았습니다.) – pacatrue

답변

0

네가 제공 한 네 개의 행만으로 테스트하는 것은 약간 어렵습니다. 나는 그것이 작동하는지 알기 위해 무작위 데이터를 만들었고 그것은 나를 위해 일하는 것 같다. 데이터를 사용해보십시오.

이 라이브러리는 data.table 라이브러리를 사용하며 ddply 안에 loops을 실행하지 않습니다. 그 수단이 중요하지 않다고 가정합니다.

library(data.table) 
dt <- data.table(df) 
l <- c(200) 

# subsetting to keep only the important fields 
dt <- dt[,list(session_id, Sentence_ID, CI, CI_Delta)] 

# Initialising First_Pass  
dt[,First_Pass := 'F'] 

# The next two lines are basically rewording your logic - 

# Within each group of session_id, Sentence_ID, identify the duplicate CI entries. These would have been inserted in l. The first time occurence of these CI entries is marked false as they wouldn't have been in l when that row was being checked 
dt[CI_Delta >= 0,duplicatedCI := duplicated(CI), by = c("session_id", "Sentence_ID")] 

# So if the CI value hasn't occurred before within the session_id,Sentence_ID group, and it doesn't appear in l, then mark it as "T" 
dt[!(CI %in% l) & !(duplicatedCI), First_Pass := "T"] 

# Just for curiosity's sake, calculating l too 
l <- c(l,dt[duplicatedCI == FALSE,CI]) 
관련 문제