2012-07-16 7 views
2

다음은 저의 작은 데이터 셋입니다.r에있는 개별 값으로 작업하기위한 루프

Indvidual <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") 
Parent1 <- c(NA, NA, "A", "A", "C", "C", "C", "E", "A", NA) 
Parent2 <- c(NA, NA, "B", "C", "D", "D", "D", NA, "D", NA) 
mydf <- data.frame (Indvidual, Parent1, Parent2) 

    Indvidual Parent1 Parent2 
1   A <NA> <NA> 
2   B <NA> <NA> 
3   C  A  B 
4   D  A  C 
5   E  C  D 
6   F  C  D 
7   G  C  D 
8   H  E <NA> 
9   I  A  D 
10  J  <NA>  <NA> 

부모가 2 명 또는 1 명인 사람을 고려해보십시오. 나는 그들의 부모가 가지고있는 점수를 계산하여 점수를 비교하고 도출해야합니다.

규칙은 부모 (parent1 또는 parent2 열의 이름) 중 하나 (NA가 아님)를 알고, 추가 점수 1 개에 부모가 갖는 점수를 더합니다. 부모가 두 명이라면 가장 높은 점수를받는 사람이 고려됩니다. (가 갖는 한 어느 공지 부모 중 하나)

따라서 예상 출력 (설명)와 dataframe 위에서는

Individual "A", has both parents unknown so will get score 0 
Indiviudal "C", has both parents known (i.e. A, B) 
will get 0 score (maximum of their parents) 

플러스 1 : 여기

는 일례이다

Indvidual Parent1 Parent2 Scores  Explanation 
1   A <NA> <NA> 0  0 (Max of parent Scores NA) + 0 (neither parent knwon) 
2   B <NA> <NA> 0  0 (Max of parent Scores NA) + 0 (neither parent knwon) 
3   C  A  B  1 0 (Max of parent Scores) + 1 (either parent knwon)  
4   D  A  C  2  1 (Max of parent scores) + 1 (either parent knwon) 
5   E  C  D  3  2 (Max of parent scores) + 1 (either parent knwon) 
6   F  C  D  3  2 (Max of parent scores) + 1 (either parent knwon) 
7   G  C  D  3  2 (Max of parent scores) + 1 (either parent knwon) 
8   H  E <NA>  4  3 (Max of parent scores) + 1 (either parent knwon) 
9   I  A  D  3  2 (Max of parent scores) + 1 (either parent knwon) 
10  J  <NA> <NA> 0  0 (Max of parent scores NA) + 0 (neither parent knwon) 

설명 : 루프가 진행될 때 이미 계산 된 스코어를 고려합니다. 최대 부모 점수

편집 : 체이스의 질문 예를 들어

에 따라 :

Individual C has two parents A and B, each of which has Scores calculated as 0 and 0 
(in row 1 and 2 and column Scores), means that max (c(0,0)) will be 0 

Individual E has parents C and D, whose scores in Scores column is (in row 3 and 4), 
1 and 2, respectively. So maximum of max(c(1,2)) will be 2. 
+0

"학부모 최대 점수"부분의 의미를 설명 할 수 있습니까? 처음에, 나는 이것이 당신이 필요로하는 것이라고 생각했지만, 그렇게 생각하지 않습니다.'rowSums (! is.na (mydf [, - 1]))' – Chase

+0

감사합니다. Chase, 제 최근 편집 내용을보십시오. 감각 .... 아이디어는 우리가 내려갈 때 우리는 각 개인에 대한 점수를 계산합니다. 부모가되면 점수가 아들/딸 점수를 계산하는 데 사용됩니다. – SHRram

+0

아, 이제 알 겠어요. "개인"인 사람들도 부모가 될 수 있습니다 ... 좋아요. 덕분에 더 명확 해졌습니다. – Chase

답변

1
Individual <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") 
Parent1 <- c(NA, NA, "A", "A", "C", "C", "C", "E", "A", NA) 
Parent2 <- c(NA, NA, "B", "C", "D", "D", "D", NA, "D", NA) 
mydf <- data.frame (Individual, Parent1, Parent2, stringsAsFactors = FALSE) 

mydf$Scores <- NA 
mydf$Scores[rowSums(is.na(mydf[, c("Parent1", "Parent2")])) == 2] <- 0 
while(any(is.na(mydf$Scores))){ 
    KnownScores <- mydf[!is.na(mydf$Scores), c(1, 4)] 
    ToCalculate <- mydf[ 
    mydf$Parent1 %in% c(KnownScores$Individual, NA) & 
    mydf$Parent2 %in% c(KnownScores$Individual, NA) & 
    is.na(mydf$Scores), 
    -4] 
    ToCalculate$Score <- apply(
    merge(
     merge(
     ToCalculate, 
     KnownScores, 
     by.x = "Parent1", 
     by.y = "Individual", 
     all.x = TRUE 
    ), 
     KnownScores, 
     by.x = "Parent2", 
     by.y = "Individual", 
     all.x = TRUE 
    )[, 4:5], 
    1, 
    max, 
    na.rm = TRUE) + 1 
    mydf <- merge(mydf, ToCalculate[, c(1, 4)], all.x = TRUE) 
    mydf$Scores[!is.na(mydf$Score)] <- mydf$Score[!is.na(mydf$Score)] 
    mydf$Score <- NULL 
} 
+0

필자는이 루프가 finsh 될 것으로 기대하고있다 ... 나는 약 15 분을 기다렸다가 실행을 멈췄다.하지만 루프가 멈추지 않는다. 나는 큰 데이터 세트에 어떤 일이 생길까 두렵다 ... 나는 RGui 64를 사용하고있다. 비트 ... 그게 예상 ... – SHRram

+0

실제로 루프가 끝내지 않는 것 같습니다 ... 나는 30 분 동안 노력 중입니다 – SHRram

+0

mydf data.frame으로 코드를 복사하여 붙여 넣었습니까? 아니면 다른 data.frame을 사용 했습니까? ? 왜냐하면 나는 즉각적인 결과를 얻었 기 때문입니다. 자체 데이터를 사용하는 경우 데이터에 문제가있을 수 있습니다. 예 : 부모는 개인으로 포함되지 않습니다. 수동으로 루프를 실행하고 ToCalculate $ Score가되는지 확인하십시오 NA – Thierry

2

plyr을 사용하고

library(plyr) 
Indvidual <- c("A", "B", "C", "D", "E", "F", "G", "H", "I", "J") 
Parent1 <- c(NA, NA, "A", "A", "C", "C", "C", "E", "A", NA) 
Parent2 <- c(NA, NA, "B", "C", "D", "D", "D", NA, "D", NA) 
mydf <- data.frame (Indvidual, Parent1, Parent2) 
scor.fun<-function(x,mydf){ 
    Explanation<-0 
    P1<-as.character(x$Parent1) 
    P2<-as.character(x$Parent2) 
    score<-as.numeric(!(is.na(P1)||is.na(P1))) 
    if(!(is.na(P1)||is.na(P2))){ 
     Explanation<-max(scor.fun(subset(mydf,Indvidual==P1),mydf)[1],scor.fun(subset(mydf,Indvidual==P2),mydf)[1]) 
     score<-score+Explanation 
    }else{ 
     Explanation<-ifelse(is.na(P1),0,scor.fun(subset(mydf,Indvidual==P1),mydf)[1]) 
     Explanation<-max(Explanation,ifelse(is.na(P2),0,scor.fun(subset(mydf,Indvidual==P2),mydf)[1])) 
     score<-score+Explanation 
    } 
    c(score,Explanation) 
} 

adply(mydf,1,scor.fun,mydf) 

아마 재귀 인수하지 최고 큰 데이터 프레임에서 재귀와 아이디어.

관련 문제