计算R中具有非数值的列的平均值

时间:2011-09-12 07:49:02

标签: r

我有一个包含数字和非数字值的列。我想找到数值的平均值,我可以用它来代替非数字值。怎么能在R?

中完成

4 个答案:

答案 0 :(得分:9)

假设您的数据框名为df,而您要“修复”的列名为df$x。您可以执行以下操作。

你必须解构然后转换为数字。这将为所有无法合并到数字的字符串提供NA。

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

正如Richie Cotton指出的那样,有一种“更有效,但更难记住”的方法将因子转换为数字

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 :(得分: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)

答案 2 :(得分:0)

这取决于您的数据是什么样的。

看起来像这样吗?

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

然后你可以

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

并获取

c(1, 2, NA)

你可以找到

的意思
mean(data.numbers, na.rm=T)

答案 3 :(得分: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