2011-09-08 4 views
0

나는 조건, 하위, & 지연의 세 가지 그룹화 변수가있는 데이터 세트가 있습니다. 여기에 내 데이터의 단순화 된 버전 (실제 데이터가 더 이상) 여러 변수를 반환하는 복잡한 함수를 사용하여 R에서 Plyr 사용

sub condition delay later_value choiceRT later_choice primeRT  cue 
10  SIZE 10   27  1832   1  888  CHILD 
10  PAST  5   11  298   0 1635  PANTS 
10  SIZE 21   13  456   0  949  CANDY 
11  SIZE 120   22  526   1 7963  BOY 
11 FUTURE 120   27  561   1 4389 CHILDREN 
11  PAST  5   13  561   1 2586  SPRING 
내가 이러한 데이터 (자세한 내용은 중요하지 않습니다)에 적용하기위한 절차의 복잡한 세트를 가지고있다 나는 다음과 같은 기능을 썼다 세 가지 그룹화 변수로 나눌 때 원하는 것을 성취합니다.

: 내가 (indiff, p_intercept, & p_lv) 나는 3 그룹 변수 당 데이터의 각 부분 집합에 적용 ddply 사용하려고

getIndiffs <- function(currdelay){ 
     if (mean(currdelay$later_choice) == 1) { 
     indiff = 10.5 
     p_intercept = "laters" 
     p_lv = "laters" 
     } 

     else if (mean(currdelay$later_choice) == 0) { 
     indiff = 30.5 

     # no p-val here, code that this was not calculated 
     p_intercept = "nows" 
     p_lv = "nows" 
     } 

     else { 
     F <- factor(currdelay$later_choice) 

     fit <- glm(F~later_value,data=currdelay,family=binomial()) 
     indiff <- -coef(fit)[1]/coef(fit)[2] 

     if (indiff < 10) indiff = 10.5 
     else if (indiff > 30) indiff = 30.5 

     p_intercept = round(summary(fit)$coef[, "Pr(>|z|)"][1],3) 
     p_lv = round(summary(fit)$coef[, "Pr(>|z|)"][2], 3) 
     c(indiff,p_intercept,p_lv) 
     } 

을에 관심이 세 변수를 반환 나는이 프로그램을 실행할 때

ddply (데이터,. (이하, 상태, 지연), getIndiffs) 그러나

, 나는 오류를 얻을

list_to_dataframe에서

오류 (고해상도, ATTR (.DATA, "split_labels")) : 결과가 동일한 길이 이상하게

이없는이 내가 단지 1 그룹화 변수를 사용할 때 잘 작동하지만, 2를 함께 오류가 발생합니다 +

또한 3 개의 그룹화 변수로 분할 된 하위 집합 만 포함하는 데이터 프레임으로 데이터 집합을 직접 "시뮬레이션"할 때 내 함수가 올바르게 작동합니다. (참고 : 3 가지 변수를 반환하거나 심지어 하나의 변수 만 반환하는 다른 방법을 시도했습니다.)

기본적으로 다중 함수를 반환하는 함수를 사용하는 방법은 plyr을 사용하는 방법입니다. 변수.

근본적으로 다른 내 문제에 대한 다른 해결책도 환영합니다.

답변

7

내 기능에 적용된 기능이 빈 데이터 프레임을 반환하면이 오류가 발생합니다. 어쨌든 상황을 디버그하는 쉬운 방법은 ddply 대신 dlply을 사용하고 출력을 검사하는 것입니다. 예 :

x <- dlply(data,.(sub,condition,delay),getIndiffs) 
sapply(x,ncol) 

이들 모두가 동일한 수의 열을 갖고 있는지 확인하십시오. 그렇지 않은 경우 기능을 표준화하십시오.

사용자의 기능처럼 보입니다. getIndiffs은 전체 데이터 프레임이 아닌 단일 행에서 실행되도록 설계되었습니다. d*ply(x,vars,fn) 핸드 fn() 전체 데이터 프레임은 해당 그룹과 일치하는 관측치의 하위 집합으로 구성됩니다. 또한 함수는 세 가지 다른 위치, 즉 각 조건절 끝에서 반환 될 수 있습니다. 나는 당신이 마지막으로 } 다음에 c(indiff,p_intercept,p_lv)을 넣고 (또 다른 }와 함께 당신의 기능을 끝내는 것을 의미한다고 생각합니다.)

+0

아! 고맙습니다. 어리석은 오타가 생겼을 수도 있지만 유용한 디버깅 팁입니다. –

관련 문제