我的 R 考試的問題是撰寫一個函式,該函式采用向量中的所有 NA,并將它們替換為所有數字索引的平均值。這是我寫的:
na_replace <- function (x)
{for (i in 1:length(x))
if (is.numeric(x[i]))
{average<- c(is.numeric(x[i]))}
if (is.na(x[i]))
{x[i] = mean(average)}
return(x)}
當我輸入向量 c(1,NA,3,NA) 時,我得到的是 1,NA,3,1。當我檢查向量時,它說第一個 NA 是數字,第二個是 NA。為什么呢?
uj5u.com熱心網友回復:
NA 不是一種型別。有各種型別的 NA(每個原子型別一個),您的型別為“_NA_numeric”。閱讀幫助頁面?NA。有一個名為的函式is.na會很有用,因為它回傳一個適合索引的邏輯向量。該is.na函式適用于所有型別的 NA。
my.bad.imputation.fun <- function(x){ x[is.na(x)] <- mean(x, na.rm=TRUE); x }
my.x <- c(1,NA,3,NA)
my.bad.imputation.fun(my.x)
#[1] 1 2 3 2
注意缺少回圈。我希望用for-loops是從其他語言拿起一個習慣,而不是你在你的類拿起.. R不盡可能多的使用戰略for環作為基本的發言權或C它有許多矢量函式代替for回圈的迭代操作。
uj5u.com熱心網友回復:
這里有一些問題。正如 IRTFM 提到的 NA 不是一個類,但我也想深入研究代碼本身:
我想你希望你的平均值在這里是 2,不是嗎?在這種情況下,采取if (is.numeric(x[i])) {average<- c(is.numeric(x[i]))}聽起來違反直覺。您希望整個向量有 1 個單一平均值,因此讓我們將其更改為以下內容:
average <- mean(x, na.rm = T)
在您的示例中na.rm,此函式的一部分很容易忽略這些NA值并取 1 和 3 的平均值。
接下來,您要確保將{}所有在 for 回圈中運行的代碼放在一起,就像您已經在處理 if 陳述句一樣。當您只運行 1 行時,技術上不需要它,但它仍然是一個很好的做法。這將如下所示:
for (i in 1:length(x)) {
if (is.na(x[i])) {
x[i] = average
}
}
但是,如果真的沒有必要,請使用顯式 for 回圈和 if 陳述句完成所有這些作業。您可以像這樣簡單地撰寫上面發布的整個回圈:
x[is.na(x)] <- average
如果我們把所有東西放在一起,你的函式可以像這樣小:
na_replace <- function (x) {
x[is.na(x)] <- mean(x, na.rm = T)
return(x)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/327726.html
