将字符变量强制转换为数字而不发出警告

时间:2014-04-24 15:33:06

标签: r class apply

我对R很新,我遇到了一个问题。我想将data.frame中的三个列从字符转换为数字。它们主要由数字组成,其中散布着一些“不可用”条目。我知道这些,我希望他们在没有看到警告的情况下被强制转到NA,所以我正在使用suppressWarnings()函数。

这是我的代码:

suppressWarnings(class(dataframe[,2]) <- "numeric")
suppressWarnings(class(dataframe[,3]) <- "numeric")
suppressWarnings(class(dataframe[,4]) <- "numeric")
print(apply(dataframe,2,class))

我的问题是打印的结果是:

          1           2           3           4 
"character" "character" "character" "character" 

所以它似乎没有改变课程!为什么是这样?

当我这样做而没有压制警告时,像这样:

  class(dataframe[,2]) <- "numeric"
  class(dataframe[,3]) <- "numeric"
  class(dataframe[,4]) <- "numeric"
  print(apply(dataframe,2,class))

我得到相同的输出,但有警告信息:

          1           2           3           4 
"character" "character" "character" "character" 
Warning messages:
1: In class(dataframe[, 2]) <- "numeric" : NAs introduced by coercion
2: In class(dataframe[, 3]) <- "numeric" : NAs introduced by coercion
3: In class(dataframe[, 4]) <- "numeric" : NAs introduced by coercion

所以这不是警告抑制问题。它必须是apply()函数,但我无法弄清楚为什么它会错误地显示类。

任何建议或协助都将不胜感激!

1 个答案:

答案 0 :(得分:2)

这里的问题是apply;看&#34;细节&#34;在?apply中:&#34;如果X不是数组[...],apply会尝试通过as.matrix将其强制转换为数组(如果它是二维的)(例如,数据框)。&#34;然后看看?as.matrix中的&#34;详细信息:&#34;如果只有原子列和任何非(数字/逻辑/复杂)列,则数据帧的方法将返回字符矩阵&# 34 ;.因此,尽管您转换为数字作品,但使用apply来循环播放#39在检查类时首先将数据框强制转换为字符矩阵。

一个小例子。首先创建一个玩具数据框:

df <- data.frame(x1 = c("a", "b"),
                 x2 = c("Not Available", 2),
                 x3 = c("Not Available", 3),
                 x4 = c(4, "Not available"))

将您选择的列转换为数字,就像您在问题中所做的那样,或者像这样:

df[, 2:4] <- lapply(df[ , 2:4], function(x) as.numeric(x))
str(df)

如果结果数据框被强制转换为矩阵,如apply那样,则会强制转换为字符矩阵

str(as.matrix(df))
# chr [1:2, 1:4] "a" "b" NA " 2" NA " 3" " 4" NA
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:4] "x1" "x2" "x3" "x4"

您可以尝试:

,而不是使用apply检查列的类
sapply(df, class)
#          x1          x2          x3          x4 
# "character"   "numeric"   "numeric"   "numeric" 

str(df)
# 'data.frame':  2 obs. of  4 variables:
# $ x1: chr  "a" "b"
# $ x2: num  NA 2
# $ x3: num  NA 3
# $ x4: num  4 NA
相关问题