使用tidyverse将具有千个分隔符值的多个因子列转换为整数

使用tidyverse将具有千个分隔符值的多个因子列转换为整数,r,tidyverse,R,Tidyverse,无法在上找到精确的解决方案,因此无论如何,我们希望使用tidyverse的R包集获得最简洁的版本。希望除第一列以外的所有列都是整数,并且在实际场景中可以容纳更多的列 df <- structure(list(col_1 = structure(1:3, .Label = c("a", "b", "c" ), class = "factor"), col_2 = structure(c(1L, 3L, 2L), .Label = c("1,234", "23", "4,567"), cla

无法在上找到精确的解决方案,因此无论如何,我们希望使用tidyverse的R包集获得最简洁的版本。希望除第一列以外的所有列都是整数,并且在实际场景中可以容纳更多的列

df <- structure(list(col_1 = structure(1:3, .Label = c("a", "b", "c"
), class = "factor"), col_2 = structure(c(1L, 3L, 2L), .Label = c("1,234", 
"23", "4,567"), class = "factor"), col_3 = structure(1:3, .Label = c("1234", 
"46", "6,789"), class = "factor")), .Names = c("col_1", "col_2", 
"col_3"), row.names = c(NA, -3L), class = "data.frame")
df在列中查找一个“
”,“
,如果存在,则使该列为数字:

df1 = lapply(df, function(x) {if(any(grepl(",", x))){x<-as.numeric(gsub(",", "", x))};x})
# as.data.frame(df1)
#  col_1 col_2 col_3
#1     a  1234  1234
#2     b  4567    46
#3     c    23  6789

df1=lapply(df,函数(x){if(any)(grepl(“,”,x)){x您可以使用
mutate_at
,排除第一列,使用
gsub
删除逗号,然后将其转换为整数:

library(tidyverse)
df %>% mutate_at(.cols = -1, funs(as.integer(gsub(",", "", .))))

#  col_1 col_2 col_3
#1     a  1234  1234
#2     b  4567    46
#3     c    23  6789

另一个带有
parse_number
的选项,它提供了数字列,不过:

df %>% mutate_at(.cols = -1, funs(parse_number))

#  col_1 col_2 col_3
#1     a  1234  1234
#2     b  4567    46
#3     c    23  6789

这是一个带有
数据.table
的版本。将'data.frame'转换为'data.table'(
setDT(df)
),在
.SDcols
中指定感兴趣的列,用
lapply
循环它们,在
gsub
中用空格替换
,转换为
整数
,并赋值(
:=/code>)它将返回到列

library(data.table)
setDT(df)[, (2:3) := lapply(.SD, function(x)
       as.integer(gsub(",", "", x))), .SDcols = 2:3]
df
#   col_1 col_2 col_3
#1:     a  1234  1234
#2:     b  4567    46
#3:     c    23  6789

要想成为真正的HadleyVersionsh,您肯定会使用stringr而不是gsub,呃。到目前为止,也可能有其他方法替代as.integer。刚刚意识到如果您使用write_csv(df,“test.csv”)和df