如何将数据帧列转换为数字类型?
当前回答
如果你遇到以下问题:
as.numeric(as.character(dat$x))
看看你的小数点。如果它们是“,”而不是“。”(如。"5,3")以上都不行。
一个潜在的解决方案是:
as.numeric(gsub(",", ".", dat$x))
我相信这在一些非英语国家是很常见的。
其他回答
在我的PC (R v.3.2.3)中,apply或sapply给出错误。Lapply效果很好。
dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))
要将字符转换为数字,您必须通过应用将其转换为因数
BankFinal1 <- transform(BankLoan, LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))
您必须用相同的数据创建两列,因为一列不能转换为数字。如果你做一次转换,它会给出如下错误
transform(BankData, LoanApp=as.numeric(LoanApproval))
警告信息: 在eval(替代(列表 (...)), `_ 数据”,parent.frame ()): 胁迫引入的NAs
所以,在做了两列相同的数据应用后
BankFinal1 <- transform(BankFinal1, LoanApp = as.numeric(LoanApp),
LoanApproval = as.numeric(LoanApproval))
它将成功地将字符转换为数字
由于(仍然)没有人得到对号,我假设您心中有一些实际问题,主要是因为您还没有指定要将哪种类型的向量转换为数字。我建议你应用变换函数来完成你的任务。
现在我要演示某些“转换异常”:
# 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
???
向帕特里克·伯恩斯致以亲切的问候!=)
我会加一条评论(不能低评级)
只需要添加user276042和pangratz
dat$x = as.numeric(as.character(dat$x))
这将覆盖现有列x的值
与hablar::转换
要轻松地将多个列转换为不同的数据类型,可以使用hablar::convert。简单的语法:df %>% convert(num(a))将列a从df转换为数值。
详细的例子
让我们将mtcars的所有列转换为字符。
df <- mtcars %>% mutate_all(as.character) %>% as_tibble()
> df
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
与hablar::转换:
library(hablar)
# Convert columns to integer, numeric and factor
df %>%
convert(int(cyl, vs),
num(disp:wt),
fct(gear))
结果:
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.88 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.44 1 0 3 1
推荐文章
- 使用pandoc从Markdown转换为PDF时设置空白大小
- 使用pandas对同一列进行多个聚合
- ggplot2折线图给出“geom_path:每组只包含一个观测值。你需要调整群体审美吗?”
- 在Python Pandas中删除多个列中的所有重复行
- 将Pandas多索引转换为列
- 熊猫数据帧得到每组的第一行
- 导入文本文件为单字符字符串
- 为什么我的熊猫'应用'功能引用多列工作?
- 移除jupyter笔记本上的内核
- 提取一个dplyr tbl列作为向量
- 查找名称包含特定字符串的列
- 将空白值(空格)替换为pandas中的NaN
- 如何在R中绘制两个直方图?
- 显示/打印tibble的所有行(tbl_df)
- Pandas数据框架fillna()只有一些列到位