2011-09-12 153 views
2

我有一列包含數字和非數字值。我想找到可以用它來代替非數字值的數值的平均值。這在R中怎麼做?計算R中具有非數值的列的平均值

+3

你能提供一個數據的例子嗎?你可以使用'dput'。由於您有混合的數據類型,我假設您使用的是包含字符或因子列的數據框。 – Anatoliy

+1

@nikhil-將均值賦給所有缺失的值是一個可怕的想法,因爲它會人爲地減少方差並導致有偏差的估計。 – richiemorrisroe

+0

@nikhil:如果你提供更多的上下文(樣本數據+它代表了什麼+你想達到什麼),那麼我們或許可以想到一個比直接替換更好的統計技術。 –

回答

0

這取決於你的數據是什麼樣子。

它看起來像這樣嗎?

data = list(1, 2, 'new jersey') 

然後,你可以

data.numbers = sapply(data, as.numeric) 

,並得到

c(1, 2, NA) 

,你可以找到與

mean(data.numbers, na.rm=T) 
+1

如果矢量實際上是一個因素,而不是一個字符,你會遇到問題(我昨天剛學會這個:)。試試:'as.numeric(as.factor(c(10,20,30)))'。 @adamleerich得到它是正確的,你必須首先將它包裝到'as.character'中。 –

8

平均說你的數據幀被命名爲df和列你要 「修復」被稱爲df$x。你可以做以下事情。

你必須不公正,然後轉換爲數字。這將爲您提供所有無法合併爲數字的字符串的NAs。

nums <- as.numeric(as.character(df$x)) 

正如裏奇棉指出,有一個「更有效,但很難記住」辦法因素轉換爲數字

nums <- as.numeric(levels(df$x))[as.integer(df$x)] 

爲了得到平均,您使用mean()但通過na.rm = T

m <- mean(nums, na.rm = T) 

將均值賦值給所有的NA值。

nums[is.na(nums)] <- m 

然後您可以替換舊數據,但我不推薦使用它。取而代之的是添加一個新列

df$new.x <- nums 
+1

有關將因子轉換爲數字的更好方法,請參閱R上的常見問題解答。 http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-do-I-convert-factors-to-numeric_003f –

2

這是我昨天寫的一個功能,用於對付非數字類型。我有一個data.frame每個列不可預知的類型。我想計算數字的手段,並保持一切不變。

colMeans2 <- function(x) { 
    # This function tries to guess column type. Since all columns come as 
    # characters, it first tries to see if x == "TRUE" or "FALSE". If 
    # not so, it tries to coerce vector into integer. If that doesn't 
    # work it tries to see if there's a ' \" ' in the vector (meaning a 
    # column with character), it uses that as a result. Finally if nothing 
    # else passes, it means the column type is numeric, and it calculates 
    # the mean of that. The end. 

# browser() 

    # try if logical 
    if (any(levels(x) == "TRUE" | levels(x) == "FALSE")) return(NA) 

    # try if integer 
    try.int <- strtoi(x) 
    if (all(!is.na(try.int))) return(try.int[1]) 

    # try if character 
    if (any(grepl("\\\"", x))) return(x[1]) 

    # what's left is numeric 
    mean(as.numeric(as.character(x)), na.rm = TRUE) 
    # a possible warning about coerced NAs probably originates in the above line 
} 

你會使用它,像這樣:

apply(X = your.dataframe, MARGIN = 2, FUN = colMeans2) 
0

緊湊的轉換:

vec <- c(0:10,"a","z") 
    vec2 <- (as.numeric(vec)) 
    vec2[is.na(vec2)] <- mean(vec2[!is.na(vec2)]) 

as.numeric將打印下面列出的警告消息,並且轉換非數字來NA

Warning message: 
In mean(as.numeric(vec)) : NAs introduced by coercion