我对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()
函数,但我无法弄清楚为什么它会错误地显示类。
任何建议或协助都将不胜感激!
答案 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