我有一个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'
}
我收到一个错误,无法将列表对象转换为类型“整数”,我在哪里错了?使用应用功能之一可以更简单地做到这一点吗?
答案 0 :(得分:2)
更简单的方法是使用dplyr::mutate_at
:
df <- dplyr::mutate_at(df, c(37:49, 53:61), as.integer)
答案 1 :(得分:1)
我认为purrr::map
或lapply
在这里提供了相当优雅的解决方案(如果可能,对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"
然后,我们想将num1
,num2
和num3
更改为整数向量(第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"