2017-11-11 8 views
0

Im 데이터 세트의 열 평균을 계산 한 다음 apply()를 사용하여 적용하는 자체 함수를 작성하지만 첫 번째 열만 반환합니다. 아래 우리는 apply에를 sumna.rm=TRUE를 사용하고 사용 할 필요가 인수에게 colMeans가 될 수 있음을함수 내에서 NA 값을 무시합니다.

mymean <- function(cleaned_us){ 
    column_total = sum(cleaned_us, na.rm = TRUE) #change 
    column_length = sum(!is.na(cleaned_us)) #change 
    return(column_total/column_length) 
} 

참고가없는 mymean로 작동하지 않을 내 코드

mymean <- function(cleaned_us){ 
    column_total = sum(cleaned_us) 
    column_length = length(cleaned_us) 
    return (column_total/column_length) 
} 

Average_2 <- apply(numeric_clean_usnews,2,mymean,na.rm=T) 
+1

'sum'도'NA가 (numeric_clean_usnews, na.rm = TRUE) '를 사용할 수 있습니다. – akrun

+0

완벽하지만, 작동하지만, 전체 길이를 취할 수 있다고 생각합니다. 요소의 양은 NA를 배제한다. . 나는 길이를 위해 na.rm을 시도했다. 그리고 그것은 그것을 사용하지 않는다. 또한 나는 colMeans를 사용할 수 있으면 좋겠지 만, 우리 자신에게 만들어달라고 요청했다. –

+0

길이를 알지 못했다. 'sum (! is.na (cleaned_us)) '를 사용할 수 있습니다. – akrun

답변

1

입니다 각 열에 mean을 가져 오는 데 사용됩니다.

+0

저에게는 효과적 이었지만 왜 그 길이만큼 sum (! is.na (cleaned_us))을할까요? 그냥 궁금해서! –

+0

@ J.McCraiton'! is.na (cleaned_us)'는 비 NA/NA 요소에 대해 TRUE/FALSE의 논리 벡터를 제공하고,'sum'은 non-NA 즉'sum (! is. na (c (NA, 3, 5, NA))) # [1] 2'. 그러나 '길이'는 4를 여기에 제공합니다. 나는 당신이 원했던 것 같아요. 그렇지 않으면 length (cleaned_us [! is.na (cleaned_us)])'할 수 있지만'sum'에 비해 느릴 것입니다. – akrun

0

정의한 함수에 na.rm 매개 변수를 전달하려면 함수의 매개 변수로 지정해야합니다. sum() 함수의 매개 변수는 na.rm이지만 length() 매개 변수는 없습니다. 그래서 당신이 작성하려고하는 함수를 작성, 당신은 말할 수 :

# include `na.rm` as a param of the argument 
mymean <- function(cleaned_us, na.rm){ 

    # pass it to `sum()` 
    column_total = sum(cleaned_us, na.rm=na.rm) 

    # if `na.rm` is set to `TRUE`, then don't count `NA`s 
    if (na.rm==TRUE){ 
    column_length = length(cleaned_us[!is.na(cleaned_us)]) 

    # but if it's `FALSE`, just use the full length 
    } else { 
    column_length = length(cleaned_us) 
    } 

    return (column_total/column_length) 
} 

그런 다음 전화가 작동합니다 :

Average_2 <- apply(numeric_clean_usnews, 2, mymean, na.rm=TRUE) 
0

사용 na.omit()

set.seed(1) 
m <- matrix(sample(c(1:9, NA), 100, replace=TRUE), 10) 

mymean <- function(cleaned_us, na.rm){ 
    if (na.rm) cleaned_us <- na.omit(cleaned_us) 
    column_total = sum(cleaned_us) 
    column_length = length(cleaned_us) 
    column_total/column_length 
} 

apply(m, 2, mymean, na.rm=TRUE) 

# [1] 5.000 5.444 4.111 5.700 6.500 4.600 5.000 6.222 4.700 6.200