dplyr更改了许多数据类型

时间:2014-12-27 14:38:54

标签: r dataframe dplyr

更改数据类型我可以使用类似

的内容
l1 <- c("fac1","fac2","fac3")
l2 <- c("dbl1","dbl2","dbl3")
dat[,l1] <- lapply(dat[,l1], factor)
dat[,l2] <- lapply(dat[,l2], as.numeric)

dplyr

dat <- dat %>% mutate(
    fac1 = factor(fac1), fac2 = factor(fac2), fac3 = factor(fac3),
    dbl1 = as.numeric(dbl1), dbl2 = as.numeric(dbl2), dbl3 = as.numeric(dbl3)
)

在dplyr中有更优雅(更短)的方式吗?

THX 克里斯托夫

7 个答案:

答案 0 :(得分:45)

您可以使用mutate_each的标准评估版(mutate_each_)来更改列类:

dat %>% mutate_each_(funs(factor), l1) %>% mutate_each_(funs(as.numeric), l2)

答案 1 :(得分:40)

?mutate_each的底部(至少在dplyr 0.5中),看起来像@docendo discimus的答案中的那个功能将被弃用并替换为更灵活的替代{{1} },mutate_ifmutate_all。与@hadley在评论中提到的最相似的可能是使用mutate_at。请注意,与mutate_at相比,参数的顺序是相反的,而mutate_each使用vars()类似语义,我将其解释为select()函数。

?select_helpers

但是dat %>% mutate_at(vars(starts_with("fac")),funs(factor)) %>% mutate_at(vars(starts_with("dbl")),funs(as.numeric)) 可以使用列号而不是mutate_at参数,在阅读完本页并查看备选方案后,我最终使用了vars()但{{1}一次捕获许多不同类型的列名(除非你总是有这么明显的列名!)

mutate_at

我很高兴找出grep + dat %>% mutate_at(grep("^(fac|fctr|fckr)",colnames(.)),funs(factor)) %>% mutate_at(grep("^(dbl|num|qty)",colnames(.)),funs(as.numeric)) ,因为现在有一行可以用于批次列。

编辑 - 现在我在select_helpers中看到mutate_at,它处理正则表达式,所以现在我喜欢这个。

grep

另一个与普遍相关的评论 - 如果您的所有日期列都具有可匹配的名称和一致的格式,则这是强大的。就我而言,这会将我的所有YYYYMMDD列(都被读作数字)转换为日期。

matches()

答案 2 :(得分:18)

由于尼克斯的答案现在已被删除,而拉斐尔的评论确实很有用,我想将其添加为答案。如果您要将所有 factor列更改为character,请使用mutate_if

dat %>% mutate_if(is.factor, as.character)

还允许其他功能。例如,我使用iconv来更改所有character列的编码:

dat %>% mutate_if(is.character, function(x){iconv(x, to = "ASCII//TRANSLIT")})

答案 3 :(得分:9)

Dplyr across函数已取代_if_at_all。参见vignette("colwise")

dat %>% 
mutate(across(all_of(l1), as.factor),
       across(all_of(l2), as.numeric))

答案 4 :(得分:4)

实现列类型转换的更一般方法如下:

如果您想将所有系数列转换为字符列,例如,可以使用一个管道完成此操作:

df %>%  mutate_each_( funs(as.character(.)), names( .[,sapply(., is.factor)] ))

答案 5 :(得分:1)

mutate_at一起使用是单线的:

dat %>% mutate_at("l1", factor) %>% mutate_at("l2", as.numeric)

答案 6 :(得分:0)

或者用convert中的hablar可能更简单:

library(hablar)

dat %>% 
  convert(fct(fac1, fac2, fac3),
          num(dbl1, dbl2, dbl3))

或与tidyselect组合:

dat %>% 
  convert(fct(contains("fac")),
          num(contains("dbl")))