24 r
我有一个我构造的数据框:
> yyz <- data.frame(a = c("1","2","n/a"), b = c(1,2,"n/a"))
> apply(yyz, 2, class)
a b
"character" "character"
Run Code Online (Sandbox Code Playgroud)
我正在尝试将最后一列转换为数字,同时仍将第一列保留为字符.我试过这个:
> yyz$b <- as.numeric(as.character(yyz$b))
> yyz
a b
1 1
2 2
n/a NA
Run Code Online (Sandbox Code Playgroud)
但是当我运行apply类时,它告诉我它们都是字符类.
> apply(yyz, 2, class)
a b
"character" "character"
Run Code Online (Sandbox Code Playgroud)
我设置错误的数据框了吗?或者它是R解释数据框的方式?
akr*_*run 46
如果我们只需要一列 numeric
yyz$b <- as.numeric(as.character(yyz$b))
Run Code Online (Sandbox Code Playgroud)
但是,如果需要更改所有列numeric,请使用lapply循环遍历列并转换为numeric首先将其转换为character类,如列所示factor.
yyz[] <- lapply(yyz, function(x) as.numeric(as.character(x)))
Run Code Online (Sandbox Code Playgroud)
OP帖子中的两列都是factor因为字符串"n/a".这可以很容易地避免在阅读使用该文件na.strings = "n/a"中read.table/read.csv,或者如果我们使用data.frame,我们可以character用列stringsAsFactors=FALSE(默认为stringsAsFactors=TRUE)
关于它的用法apply,它将数据集转换为matrix并且matrix只能容纳一个类.要检查class,我们需要
lapply(yyz, class)
Run Code Online (Sandbox Code Playgroud)
要么
sapply(yyz, class)
Run Code Online (Sandbox Code Playgroud)
或检查
str(yyz)
Run Code Online (Sandbox Code Playgroud)