如何将数据框中的所有非数字单元格转换为NA

时间:2017-03-29 06:34:21

标签: r missing-data

我正在尝试将具有非数字值的所有单元格转换为缺失数据(NA)。我尝试了类似的将特定值转换为缺失数据的方法,例如:

recode_missing <- function (g, misval)
{
  a <- g == misval
  temp = g
  temp [a] <- NA
  return (temp)
}

效果很好:优雅的R解决方案。

我尝试解码如a <- g == is.numeric ()(语法错误),a <- is.numeric (g): (Error: (list) object cannot be coerced to type 'double'), or even a [,]&lt; - is.numeric(g [,]`(相同)。我知道解决方案删除列

remove_nn <- function (data)
{
  # removes all non-numeric columns
  numeric_columns <- sapply (data, is.numeric)
  return (data [, numeric_columns])
} ### remove_nn ###

但是这会删除列并将数据帧转换为某个矩阵。

有人可以建议如何将单个非数字单元格转换为NA,同时保持数据结构完整吗?

修改

正如评论所指出的那样,在数值的海洋中没有单独的字符串值。只是数字或其他的向量。我现在想知道是什么导致了medians <- apply (data, 2, median)中的非数字错误。我有很多载体,通过眼睛检查证明没用。我发布了num <- sapply (data, is.numeric)和下一个data [,!num]。这给了我非数字的列。在一种情况下,由一个单元格值包含多余的“。文件由电子表格预处理,如果只有一个单元格是非数字的,则完整的向量被视为非数字。” / p>

2 个答案:

答案 0 :(得分:3)

根据您的编辑,您的矢量应该是数字,但由于在读入过程中引入了一些错误数据,数据已转换为其他格式(可能是character或{{1} })。

以下是该案例的一个例子。 factor只会使用相同的数据创建三个mydf1 <- mydf2 <- mydf3 <- data.frame(...)

data.frame

执行此操作的一种方法是让R将任何无法转换为数字的值强制转换为# I'm going to show three approaches mydf1 <- mydf2 <- mydf3 <- data.frame( A = c(1, 2, "x", 4), B = c("y", 3, 4, "-") ) str(mydf1) # 'data.frame': 4 obs. of 2 variables: # $ A: Factor w/ 4 levels "1","2","4","x": 1 2 4 3 # $ B: Factor w/ 4 levels "-","3","4","y": 4 2 3 1

NA

另一种选择是使用my SOfun package中的## You WILL get warnings mydf1[] <- lapply(mydf1, function(x) as.numeric(as.character(x))) # Warning messages: # 1: In FUN(X[[i]], ...) : NAs introduced by coercion # 2: In FUN(X[[i]], ...) : NAs introduced by coercion str(mydf1) # 'data.frame': 4 obs. of 2 variables: # $ A: num 1 2 NA 4 # $ B: num NA 3 4 NA

makemeNA

此功能略有不同,因为它使用library(SOfun) makemeNA(mydf2, "[^0-9]", FALSE) # A B # 1 1 NA # 2 2 3 # 3 NA 4 # 4 4 NA str(.Last.value) # 'data.frame': 4 obs. of 2 variables: # $ A: int 1 2 NA 4 # $ B: int NA 3 4 NA 进行转换,并且可以处理更具体的转换为type.convert的规则(就像您可以使用{{1}的向量一样当将数据读入R)时。

关于您的错误,我相信您会在NA上尝试na.strings来获取您所显示的错误。

示例:

as.numeric

你不会在data.frame上收到错误(但你仍会得到警告)....

# Your error...
as.numeric(mydf3)
# Error: (list) object cannot be coerced to type 'double'

为什么我们不需要明确使用matrix# You'll get a warning as.numeric(as.matrix(mydf3)) # [1] 1 2 NA 4 NA 3 4 NA # Warning message: # NAs introduced by coercion 为您做到了这一点:

as.character

您如何使用该信息?

as.matrix

答案 1 :(得分:0)

简单是最好的。选择列-我选择了第4列到第31列。

df[,4:31] <- as.numeric(as.factor(as.character(df[,4:31])))