我是R的初学者,想知道是否有任何方法可以将多个向量/变量转换为所需的类#' (例如,数据集中的3个变量是因子,我想一次性将这3个变量转换为数值变量。)
下面的数据集包含"Product"
列chr
,其余列为factor
,但我希望将"Product"
和"Month"
保留为字符,"Sales"
和"Profit"
为数字。
str(Conditional_function_IVY)
'data.frame': 100 obs. of 4 variables:
$ Product: chr "Bellen" "Bellen" "Sunshine" "Sunset" ...
$ Month : Factor w/ 12 levels "April","August",..: 5 5 5 5 5 5 5 5 4 4 ...
$ Sales : Factor w/ 88 levels " ? 501.00 "," ? 504.00 ",..: 8 13 64 16 55 78 81 29 2 52 ...
$ Profit : Factor w/ 65 levels " ? 100.00 "," ? 101.00 ",..: 44 34 5 15 39 16 37 38 65 56 ...
我已经通过以下方式完成了它,但它消耗了大量时间,因此我想知道是否有任何方法可以让我一次性完成这项工作。
Conditional_function_IVY$Month=as.character(Conditional_function_IVY$Month)
> Conditional_function_IVY$Sales=as.numeric(Conditional_function_IVY$Sales)
> Conditional_function_IVY$Profit=as.numeric(Conditional_function_IVY$Profit)
> str(Conditional_function_IVY)
'data.frame': 100 obs. of 4 variables:
$ Product: chr "Bellen" "Bellen" "Sunshine" "Sunset" ...
$ Month : chr "January" "January" "January" "January" ...
$ Sales : num 8 13 64 16 55 78 81 29 2 52 ...
$ Profit : num 44 34 5 15 39 16 37 38 65 56 ...
答案 0 :(得分:1)
解决此问题的最佳方法是在创建/导入日期框架时,来自 tidyverse 的更现代的方法,例如readr
和tibble
可以很好地处理猜测列类型并且不会自动转换为因子。
如果这不适合您,那么您可以非常简单地使用dplyr::mutate
进行转换。
library(magrittr)
library(dplyr)
Conditional_function_IVY %<>%
mutate(
Month = as.character(Month),
Sales = as.numeric(as.character(Sales)),
Profit = as.numeric(as.character(Profit))
)
但是,我注意到在结构中可以看到一些非常奇怪的值,其中存储了数值。可以使用gsub
将这些文章剥离为数字。
例如 as.numeric(gsub("[^0-9.]", "", " ? 501.00 ")) # [1] 501
使用您可以从您的问题中获得的两行您自己的数据。
Conditional_function_IVY <- data.frame(
Product = rep("Bellen", 2),
Month = c("April", "August"),
Sales = c(" ? 501.00 ", " ? 504.00 "),
Profit = c(" ? 100.00 ", " ? 101.00 ")
)
Conditional_function_IVY %>%
mutate(
Month = as.character(Month),
Sales = as.numeric(gsub("[^0-9.]", "", as.character(Sales))),
Profit = as.numeric(gsub("[^0-9.]", "", as.character(Profit)))
)
# Product Month Sales Profit
# 1 Bellen April 501 100
# 2 Bellen August 504 101
答案 1 :(得分:1)
我喜欢Kevin的方法,除了我不喜欢as.numeric(gsub("[^0-9.]", "", as.character(...))
的复制/粘贴/编辑。如果你有10列,这将是乏味的,如果你有100列,这将是完全不切实际的。我会定义一个小实用程序功能,并执行以下操作:
# define helper function
sub_convert = function(x) as.numeric(gsub("[^0-9.]", "", as.character(...))
# using base R
to_convert = names(Conditional_function_IVY)[sapply(Conditional_function_IVY, is.factor)]
Conditional_function_IVY[to_convert] = lapply(
Conditional_function_IVY[to_convert],
sub_convert
)
# or using dplyr
library(dplyr)
Conditional_function_IVY = mutate_if(
Conditional_function_IVY,
is.factor,
sub_convert
)
这样可以更好地扩展,并且还具有以下优势:如果您需要调整sub_convert
函数,则只需在一个位置编辑它,而不是每次都使用它。