2014-10-15 6 views
1

전체 목표는 문자열의 테이블 (실험의 합성 샘플 내용)을 새 문자열로 다시 쓰는 것입니다 (M, L, 또는 B)가 무엇인지를 나타냅니다. 나는 stri_count_fixed를 사용하여 각 요소의 수를 구하고 MO, LI 및 BA라는 세 개의 별도 벡터에이 수를 계산했습니다. 이제는 원래의 문자열을 M, L 또는 B 중 가장 큰 숫자로 다시 쓰고 자 할 경우 타이가 있으면 "T"로 바꿉니다. 참고 : NA가 하나 있습니다.R : 하나의 조건을 기반으로 데이터 프레임의 문자열을 대체하려고합니다. TRUE/FALSE가 필요한 곳에 누락 값 가져 오기

그래서 루프 내 :

for (i in 1:60) { 
    if (is.nan(MO[i])) {content$Content[i]<-NA) 
    } else {  
     if (MO[i] > LI[i] && MO[x] > BA[i]){ 
     content$Content[x]<-"M" 
     } else { 
     if (LI[i] > MO[i] && LI[i] > BA[i]) { 
      content$Content[i]<-"L" 
     } else { 
      if (BA [i] > MO[i] && BA[i] > LI[i]) { 
      content$Content[i]<-"B" 
      } else { 
      content$Content[i]<-"T" 
      } 
     } 
     } 
    } 
} 

내가이 오류 중 하나 MO는 [I] [I], NA를 던지고있다, LI [I], 또는 BA는 비록에게 내가 이해하지 못하는 것을 의미 이해 이것이 단순 벡터에 대해 어떻게 일어날 수 있는지를 설명합니다. 모든 i를 1로 대체하면 if 체인이 정상적으로 작동하므로 실제로 어떤 일이 일어나는지 전혀 알 수 없습니다. 어떤 도움이라도 대단히 감사하겠습니다. 아마도 조건없이이 작업을 수행 할 수있는 방법이있을 것입니다. 시간에 나는이 작업을 썼다지만, 난 그냥 ... 손으로 할 수 있었다

+0

'is.nan (NA)'는'거짓 '입니다. 어쩌면 당신은'is.na()'대신에 ?? –

+0

왜 두 번째 경우 MO [x] 및 Content [x]입니까? – ARobertson

+0

좋은 캐치, ARobertson! 그게 문제 였을지 모르지만 솔직히 다른 컴퓨터를 사용하고 작동한다는 것을 기억합니다. 상관없이 고마워! –

답변

1

시도 :

content$Content = ifelse(is.na(MO), NA, 
    ifelse(MO > LI & MO > BA, M, 
    ifelse(LI > MO & LI > BA, L, 
    ifelse(BI > MO & BA > LI, B, T  ) ) ) ) 
1

당신은 data.frames을 좋아하고 적용하는 경우 :

# recreate data 
MO <- round(runif(60,0,10)) 
MO[c(4,6,10)] <- NA 
LI <- round(runif(60,0,10)) 
BA <- round(runif(60,0,10)) 

# combine into dataframe 
df <- data.frame(MO,LI,BA) 

# run function on each row 
df$maxes <- apply(df,1,function(x){ 
    # get the matching letters (could be multiple) 
    maxes <- c('M','L','B')[x == max(x)] 
    # check for NA, tie, or just send result 
    if(any(is.na(maxes))){ 
    NA 
    }else if(length(maxes) > 1){ 
    'T' 
    }else{ 
    maxes 
    } 
}) 
# the character vector 
content$Content <- df$maxes 

물론 maxes 변수는 건너 뛸 수 있지만 그 답을 다시 확인하는 것이 좋습니다.