2017-11-11 234 views
0

我正在編寫自己的函數來計算數據集中列的平均值,然後使用apply()函數應用它,但它只返回第一列平均值。下面是我的代碼忽略函數中的NA值

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'也有'吶.rm'參數'sum(cleared_us,na.rm = TRUE)'此外,你可以使用'colMeans(numeric_clean_usnews,na.rm = TRUE)' – akrun

+0

完美,這可以工作,但我認爲它可能會佔總數元素的數量並不排除NA 。我試了na.rm的長度,它不使用它。另外我希望我可以使用colMeans,但它要求我們製作我們自己的 –

+0

我沒有注意到這個長度。你可以使用'sum(!is.na(cleaned_us))' – akrun

回答

1

我們需要使用na.rm=TRUEsum,並用它在apply不會爲mymean工作並沒有這樣的說法

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) 
} 

注意colMeans可用於獲取每列的mean

+0

這對我很有用,但爲什麼我們要求sum(!is.na(cleaned_us))的長度?只是好奇! –

+0

@ J.McCraiton'!is.na(cleaned_us)'給出了非NA/NA元素的TRUE/FALSE的邏輯向量,'sum'將得到那些非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