如何将数据帧列转换为数字类型?
当前回答
如果x是dataframe dat的列名,x的类型是factor,使用:
as.numeric(as.character(dat$x))
其他回答
要将数据帧列转换为数字,你只需要做:-
因数转换为数字:-
data_frame$column <- as.numeric(as.character(data_frame$column))
使用下面的代码,您可以将所有数据帧的列转换为数字(X是我们想要转换它的列的数据帧):
as.data.frame(lapply(X, as.numeric))
要将整个矩阵转换为数字,你有两种方法: :
mode(X) <- "numeric"
or:
X <- apply(X, 2, as.numeric)
你也可以使用数据。矩阵函数将所有内容转换为数字,尽管要注意,因子可能无法正确转换,因此先将所有内容转换为字符会更安全:
X <- sapply(X, as.character)
X <- data.matrix(X)
如果我想同时转换成矩阵和数字,我通常使用最后一个
由于(仍然)没有人得到对号,我假设您心中有一些实际问题,主要是因为您还没有指定要将哪种类型的向量转换为数字。我建议你应用变换函数来完成你的任务。
现在我要演示某些“转换异常”:
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
让我们看一下data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
让我们奔跑:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
现在你可能会问自己“异常点在哪里?”好吧,我在R中遇到过非常奇怪的东西,这不是最令人困惑的事情,但它会让你困惑,尤其是如果你在睡觉前读了这篇文章。
开始:前两列是字符。我故意把第二个称为fake_char。注意这个字符变量与Dirk在他的回复中创建的一个字符变量的相似性。它实际上是一个转换成字符的数字向量。第三和第四列是因子,最后一列是“纯”数字。
如果使用transform函数,则可以将fake_char转换为数字类型,但不能将char变量本身转换为数字类型。
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
但如果你在fake_char和char_fac上做同样的事情,你会很幸运,并且没有NA:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
如果你保存转换后的data.frame并检查模式和类,你会得到:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
因此,结论是:是的,您可以将字符向量转换为数字向量,但前提是它的元素可以“转换”为数字。如果vector中只有一个字符元素,则在尝试将该vector转换为数值1时将会得到错误。
为了证明我的观点:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
现在,只是为了好玩(或练习),试着猜测这些命令的输出:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
向帕特里克·伯恩斯致以亲切的问候!=)
有一点对我很有帮助:如果要转换的变量范围(或者不止一个),可以使用sapply。
有点荒谬,举个例子:
data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)
假设第3列、第6-15列和第37列的数据帧需要转换为数字:
dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
如果您不关心保留因子,并希望将其应用到任何可以转换为数字的列,我使用下面的脚本。 如果df是您的原始数据框架,您可以使用下面的脚本。
df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x), x)))
顺便说一句,我参考了谢恩和乔兰的解决方案
推荐文章
- 在R中同一行打印字符串和变量内容
- 使用pandoc从Markdown转换为PDF时设置空白大小
- 使用pandas对同一列进行多个聚合
- ggplot2折线图给出“geom_path:每组只包含一个观测值。你需要调整群体审美吗?”
- 在Python Pandas中删除多个列中的所有重复行
- 将Pandas多索引转换为列
- 熊猫数据帧得到每组的第一行
- 导入文本文件为单字符字符串
- 为什么我的熊猫'应用'功能引用多列工作?
- 移除jupyter笔记本上的内核
- 提取一个dplyr tbl列作为向量
- 查找名称包含特定字符串的列
- 将空白值(空格)替换为pandas中的NaN
- 如何在R中绘制两个直方图?
- 显示/打印tibble的所有行(tbl_df)