将数字映射为数据框的特定列

问题描述 投票:0回答:2

我具有以下格式的一些数据,其中所有列的类型均为chr

#> # A tibble: 3 x 4
#>   id    age   name  income
#>   <chr> <chr> <chr> <chr> 
#> 1 1     18    jim   100   
#> 2 2     21    bob   200   
#> 3 3     16    alice 300

我只想在某些列上使用as.numeric()。最好,我想定义一个列名称的向量,然后使用purrr:mapas.numeric()映射到仅那些列:

numeric_variables <- c("id", "age", "income")

我如何map

我想要的输出看起来像:


df
#> # A tibble: 3 x 4
#>      id   age name  income
#>   <dbl> <dbl> <chr>  <dbl>
#> 1     1    18 jim      100
#> 2     2    21 bob      200
#> 3     3    16 alice    300

下面的数据输入代码。

library(purrr)
df <- data.frame(stringsAsFactors=FALSE,
          id = c(1, 2, 3),
         age = c(18, 21, 16),
        name = c("jim", "bob", "alice"),
      income = c(100, 200, 300)
)
df <- map_df(df, as.character)
df

reprex package(v0.3.0)在2020-02-15创建

r dplyr purrr
2个回答
2
投票

您可以使用map_at

df[] <- purrr::map_at(df, numeric_variables, as.numeric)
df
# A tibble: 3 x 4
#     id   age name  income
#  <dbl> <dbl> <chr>  <dbl>
#1     1    18 jim      100
#2     2    21 bob      200
#3     3    16 alice    300

2
投票

我们可以使用mutate_at

library(dplyr)
df %>%
  mutate_at(vars(numeric_variables), as.numeric) %>%
  as_tibble
# A tibble: 3 x 4
#     id   age name  income
#  <dbl> <dbl> <chr>  <dbl>
#1     1    18 jim      100
#2     2    21 bob      200
#3     3    16 alice    300

或更容易

df %>%
    type.convert(as.is = TRUE)

或带有map

library(purrr)
df %>%
   map_if(names(.) %in% numeric_variables, as.numeric) %>%
   bind_cols
# A tibble: 3 x 4
#     id   age name  income
#  <dbl> <dbl> <chr>  <dbl>
#1     1    18 jim      100
#2     2    21 bob      200
#3     3    16 alice    300

或者,如果我们使用复合赋值运算符(%<>%),则可以就地赋值

library(magrittr)
df %<>%
   map_if(names(.) %in% numeric_variables, as.numeric) %<>%
   bind_cols
str(df)
#tibble [3 × 4] (S3: tbl_df/tbl/data.frame)
# $ id    : num [1:3] 1 2 3
# $ age   : num [1:3] 18 21 16
# $ name  : chr [1:3] "jim" "bob" "alice"
#  $ income: num [1:3] 100 200 300
© www.soinside.com 2019 - 2024. All rights reserved.