将矢量一次转换为数字和字符

时间:2017-12-13 06:17:21

标签: r

我是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 ...

2 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是在创建/导入日期框架时,来自 tidyverse 的更现代的方法,例如readrtibble可以很好地处理猜测列类型并且不会自动转换为因子。

如果这不适合您,那么您可以非常简单地使用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函数,则只需在一个位置编辑它,而不是每次都使用它。