我有一个包含数字和非数字值的列。我想找到数值的平均值,我可以用它来代替非数字值。怎么能在R?
中完成答案 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