我有一个我构建的数据框:
> yyz <- data.frame(a = c("1","2","n/a"), b = c(1,2,"n/a"))
> apply(yyz, 2, class)
a b
"character" "character"
我正在尝试将最后一列转换为数字,同时仍将第一列保留为字符。我试过这个:
> yyz$b <- as.numeric(as.character(yyz$b))
> yyz
a b
1 1
2 2
n/a NA
但是当我运行apply类时,它告诉我它们都是字符类。
> apply(yyz, 2, class)
a b
"character" "character"
我设置错误的数据框了吗?或者它是R解释数据框的方式吗?
答案 0 :(得分:34)
如果我们只需要一列numeric
yyz$b <- as.numeric(as.character(yyz$b))
但是,如果所有列都需要更改为numeric
,请使用lapply
循环列并转换为numeric
,方法是先将其转换为character
类,列是factor
。
yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x)))
由于字符串factor
,OP帖子中的两列都是"n/a"
。使用na.strings = "n/a"
中的read.table/read.csv
阅读文件时可以轻松避免这种情况,或者如果我们使用data.frame
,我们可以character
列stringsAsFactors=FALSE
(默认值为stringsAsFactors=TRUE
)
关于apply
的使用,它将数据集转换为matrix
,而matrix
只能容纳一个类。要查看class
,我们需要
lapply(yyz, class)
或者
sapply(yyz, class)
或检查
str(yyz)