2014-11-17 4 views
0

변수 (열)가 3000 개 이상인 데이터 집합에서 품질 관리를 수행해야합니다. 그러나 몇 가지 조건 만 적용하려고합니다. 첫 번째 단계는 이상 치를 NA으로 대체하는 것입니다. 나는 3보다 크거나 작은 관측을 mean에서 NA으로 대체하려고합니다. 컬럼별로 열을 처리했습니다.두 개의 "for 루프"for R

height = ifelse(abs(height-mean(height,na.rm=TRUE)) < 
          3*sd(height,na.rm=TRUE),height,NA) 

그리고 다른 열을 기반으로 다른 변수를 만들고 싶습니다. 예를 들어 :

data$CGmark = ifelse(!is.na(data$mark) & !is.na(data$height) , 
           paste(data$age, data$mark,sep=""),NA) 

내 데이터 세트의 예는 다음과 같습니다

name = factor(c("A","B","C","D","E","F","G","H","H")) 
height = c(120,NA,150,170,NA,146,132,210,NA) 
age = c(10,20,0,30,40,50,60,NA,130) 
mark = c(100,0.5,100,50,90,100,NA,50,210) 
data = data.frame(name=name,mark=mark,age=age,height=height) 
data 

내가 시도이 (하나 개의 조건에 대한) :

d1=names(data) 
list = c("age","height","mark") 
ntraits=length(list) 
nrows=dim(data)[1] 
for(i in 1:ntraits){ 
a=list[i] 
b=which(d1==a) 
d2=data[,b] 
for (j in 1:nrows){ 
        d2[j] = ifelse(abs(d2[j]-mean(d2,na.rm=TRUE)) < 3*sd(d2,na.rm=TRUE),d2[j],NA) 
        } 
} 

누군가가 내가 저장하고 있지 않다 말해 줬어 d2. 원하는 조건을 적용하기 위해 for loops을 어떻게 만들 수 있습니까? 나는 유사한 질문이있다 그러나 나는 그것을 아직 얻지 않았다는 것을 알고있다. 미리 감사드립니다.

+2

"효율적인 for 루프를 만들어 원하는 조건을 적용하려면 어떻게합니까?"나중에 효과를 걱정하는 것. – shadowtalker

답변

2

거의 첫 줄에 답을 적었습니다. 너는 이걸 지나치는거야.

먼저, 이러한 종류의 작업을 함수에 캡슐화하는 것이 좋습니다. 예, 함수 디스패치는 다른 것보다 조금 느립니다. 그러나 코드는 종종 읽고 디버그하기가 더 쉽습니다. mean_x과 같은 "도우미"변수를 할당하는 경우에도 동일합니다. 변수를 할당하는 비용은 매우 작고 걱정할 필요가 없습니다.

NA_outside_3s <- function(x) { 
    mean_x <- mean(x) 
    sd_x <- sd(x,na.rm=TRUE) 
    x_outside_3s <- abs(x - mean(x)) < 3 * sd_x 
    x[x_outside_3s] <- NA # no need for ifelse here 
    x 
} 

물론 원하는 기능 이름을 선택할 수 있습니다. 더 잘 설명하는 것이 좋습니다.

그런 다음 매우 열에 기능을 적용하려면 열을 반복하면됩니다. 그 함수 NA_outside_3s은 이미 벡터화되어 있습니다. 즉, 논리적 벡터를 인수로 취해서 같은 길이의 벡터를 반환합니다. 당신은 당신의 코드 당신이 한 방법을 썼다 (그리고 나에게조차 당신이 뭘하려고했는지 이해하는 분했다)하지만 열 전체를 반복하는 것은 보통 간단 왜

cols_to_loop_over <- 1:ncol(my_data) # or, some subset of columns. 
for (j in cols_to_loop_over) { 
    my_data[, j] <- NA_if_3_sd(my_data[, j]) 
} 

잘 모르겠어요. 내 댓글에

나는 효율성에 대해 걱정하지만, 당신이 lapply를 사용하여 다시 작성해야 당신이 루프 작동 방식을 이해하면하지 말라고 :

my_data[cols_to_loop_over] <- lapply(my_data[cols_to_loop_over], NA_outside_3s) 

당신이 기능의 apply 가족이 어떻게 작동하는지 알게되면, 그들은 제대로 쓰면 매우 읽기 쉽습니다. 그리고 네, 루핑보다 다소 빠르지 만 예전 만큼은 아닙니다. 더 스타일과 가독성의 문제입니다.

또한 변수 이름을 list으로 지정하지 마십시오! 이 함수는 list 함수를 숨 깁니다.이 함수는 R 내장 함수이고 그 중 상당히 중요한 함수입니다. 내장 된 데이터 세트를로드하기위한 data 기능이 있기 때문에 일반적으로 변수 이름을 data으로 지정하면 안됩니다.

+0

고맙습니다. @ssdecontrol. 정말 잘 설명했습니다. 환호. – PaulaF

+1

@PaulaF 도움이되기를 기쁘게 생각합니다. 사람들은 종종 학습하는 것을 깨닫지 않고 R을 사용하는 법을 배웁니다. 본격적인 프로그래밍 언어이므로 제대로 프로그래밍하는 법을 배우지 못합니다. 그러나 이제는 좋은 코딩 방법을 배우는 데 시간을 쏟으면 장래에 많은 문제를 방지하고 원하는 경우 다른 프로그래밍 언어를 쉽게 배울 수 있습니다. – shadowtalker

관련 문제