使用 dplyr 更改列类型

wil*_*ley 4 r dplyr mutate

我需要一些帮助来整理我的数据。我正在尝试将一些整数转换为因子(但不是所有整数都转换为因子)。我想我可以选择有问题的变量,但如何将它们添加回原始数据集?例如,保持未从我的 raw_data_tbl 中选择的值并使用来自raw_data_tbl_int

在此处输入图片说明

在此处输入图片说明

    library(dplyr)

    raw_data_tbl %>% 
    select_if(is.numeric) %>% 
    select(-c(contains("units"), PRO_ALLOW, RTL_ACTUAL, REAL_PRICE, 
           REAL_PRICE_HHU, REBATE, RETURN_UNITS, UNITS_PER_CASE, Profit, STR_COST, DCC, 
           CREDIT_AMT)) %>% 
    mutate_if(is.numeric, as.factor)
Run Code Online (Sandbox Code Playgroud)

Dav*_*ald 8

你可以mutate_at改用。这是使用iris数据框的示例:

library(dplyr)

iris_factor <- iris %>%
  mutate_at(vars(Sepal.Width, 
                 Sepal.Length), 
            funs(factor))
Run Code Online (Sandbox Code Playgroud)

编辑 08/2020

从 dplyr 0.8.0 开始,funs()已弃用。使用list()替代,如

library(dplyr)

iris_factor <- iris %>%
  mutate_at(vars(Sepal.Width, 
                 Sepal.Length), 
            list(factor))
Run Code Online (Sandbox Code Playgroud)

和证明:

> str(iris_factor)
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: Factor w/ 35 levels "4.3","4.4","4.5",..: 9 7 5 4 8 12 4 8 2 7 ...
 $ Sepal.Width : Factor w/ 23 levels "2","2.2","2.3",..: 15 10 12 11 16 19 14 14 9 11 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Run Code Online (Sandbox Code Playgroud)


小智 8

由于在CRAN 2020年6月1日,该范围的功能发布dplyr 1.0.0 mutate_at()mutate_if()mutate_all()已被取代感谢更加普及across()。这意味着您可以只使用mutate(). 4 月的介绍性博客文章解释了为什么花了这么长时间才发现。

玩具示例:

library(dplyr)

iris %>%
  mutate(across(c(Sepal.Width, 
                  Sepal.Length),
                factor))
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你会这样做:

library(dplyr)

raw_data_tbl %>% 
  mutate(across(c(is.numeric,
                  -contains("units"),
                  -c(PRO_ALLOW, RTL_ACTUAL, REAL_PRICE, REAL_PRICE_HHU,
                     REBATE, RETURN_UNITS, UNITS_PER_CASE, Profit,
                     STR_COST, DCC, CREDIT_AMT)),
                factor))
Run Code Online (Sandbox Code Playgroud)


Let*_*ero 6

老实说,我会这样做:

library(dplyr)

df = data.frame("LOC_ID" = c(1,2,3,4),
                "STRS" = c("a","b","c","d"),
                "UPC_CDE" = c(813,814,815,816))

df$LOC_ID = as.factor(df$LOC_ID)
df$UPC_CDE = as.factor(df$UPC_CDE)
Run Code Online (Sandbox Code Playgroud)

  • 总是喜欢在不必要的时候不依赖软件包,所以我们的两种解决方案都有时间和地点! (3认同)