如何将数据帧列转换为数字类型?
当前回答
在我的PC (R v.3.2.3)中,apply或sapply给出错误。Lapply效果很好。
dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(x)))
其他回答
要将数据帧列转换为数字,你只需要做:-
因数转换为数字:-
data_frame$column <- as.numeric(as.character(data_frame$column))
虽然你的问题严格是关于数字的,但在开始r时,有许多转换是难以理解的。我将致力于解决帮助的方法。这个问题和这个问题类似。
在R中,类型转换可能是一种痛苦,因为(1)因子不能直接转换为数字,它们需要首先转换为字符类,(2)日期是一种特殊情况,通常需要单独处理,(3)跨数据帧列的循环可能很棘手。幸运的是,“潮流宇宙”已经解决了大部分问题。
This solution uses mutate_each() to apply a function to all columns in a data frame. In this case, we want to apply the type.convert() function, which converts strings to numeric where it can. Because R loves factors (not sure why) character columns that should stay character get changed to factor. To fix this, the mutate_if() function is used to detect columns that are factors and change to character. Last, I wanted to show how lubridate can be used to change a timestamp in character class to date-time because this is also often a sticking block for beginners.
library(tidyverse)
library(lubridate)
# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 2012-05-04 09:30:00 BAC T 7.8900 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.8850 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.8900 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.8900 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.8900 85053 F 7.88 108101 7.90
# Converting columns to numeric using "tidyverse"
data_df %>%
mutate_all(type.convert) %>%
mutate_if(is.factor, as.character) %>%
mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <dttm> <chr> <chr> <dbl> <int> <chr> <dbl> <int> <dbl>
#> 1 2012-05-04 09:30:00 BAC T 7.890 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.885 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.890 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.890 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.890 85053 F 7.88 108101 7.90
在我的PC (R v.3.2.3)中,apply或sapply给出错误。Lapply效果很好。
dt[,2:4] <- lapply(dt[,2:4], function (x) as.factor(as.numeric(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)
推荐文章
- 当我的ggplot2语法合理时,我如何处理R CMD检查“全局变量无可见绑定”注释?
- 如何解窝(爆炸)在一个熊猫数据帧列,成多行
- 如何将表转换为数据帧
- 转换data.frame列到向量?
- 在每个列表元素上调用int()函数?
- 如何将颜色分配给ggplot2中具有稳定映射的类别变量?
- 在基础图形的绘图区域之外绘制一个图例?
- 根据Pandas中的另一列提取列值
- 在ggplot2中的各个facet上注释文本
- 确定数据帧列的数据类型
- 删除重复的行
- NumPy或Pandas:保持数组类型为整数,同时具有NaN值
- 将行名转换为第一列
- 如何替换一个Pandas数据框架的字符串列中的文本?
- 从pandas apply()返回多个列