如何通过for循环更改列的类型?

时间:2018-10-08 22:17:45

标签: r

我有一个df,其中某些列是type字符,我希望它们是整数值。我知道我可以使用as.integer切换输入类型:

df$i <- as.integer(df$i)

但是我想让循环更改一堆列,而不是必须多次运行命令。到目前为止,这是我的代码:

cols_to_change = c(37:49, 53:61)
  for(i in cols_to_change)
  {
    class(df[, i])  <- 'integer'
  }

我收到一个错误,无法将列表对象转换为类型“整数”,我在哪里错了?使用应用功能之一可以更简单地做到这一点吗?

2 个答案:

答案 0 :(得分:2)

更简单的方法是使用dplyr::mutate_at

df <- dplyr::mutate_at(df, c(37:49, 53:61), as.integer)

答案 1 :(得分:1)

我认为purrr::maplapply在这里提供了相当优雅的解决方案(如果可能,对R中的for循环说不):

让我们为您提供一个包含所有字符向量的假数据框:

> df <- data.frame(let1 = c('a', 'b', 'c'), num1 = c('1', '2', '3'),
             let2 = c('d', 'e', 'f'), num2 = c('4', '5', '6'),
             num3 = c('7', '8', '9'), let3 = c('g', 'h', 'i'),
             stringsAsFactors = FALSE)
> str(df)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: chr  "1" "2" "3"
 $ let2: chr  "d" "e" "f"
 $ num2: chr  "4" "5" "6"
 $ num3: chr  "7" "8" "9"
 $ let3: chr  "g" "h" "i"

然后,我们想将num1num2num3更改为整数向量(第2、4和5列)。为了说明起见,将df复制到df2,然后使用purrr::map。在这里,我通过列号指代这些列,但您也可以使用名称。

> df2 <- df
> df2[, c(2,4,5)] <- purrr::map(df2[, c(2,4,5)], as.integer)
> str(df2)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: int  1 2 3
 $ let2: chr  "d" "e" "f"
 $ num2: int  4 5 6
 $ num3: int  7 8 9
 $ let3: chr  "g" "h" "i"

如果您不想加载任何其他软件包,则lapply将起作用:

> df3 <- df
> df3[, c(2,4,5)] <- lapply(df3[, c(2,4,5)], as.integer)
> str(df3)
'data.frame':   3 obs. of  6 variables:
 $ let1: chr  "a" "b" "c"
 $ num1: int  1 2 3
 $ let2: chr  "d" "e" "f"
 $ num2: int  4 5 6
 $ num3: int  7 8 9
 $ let3: chr  "g" "h" "i"