更改数据类型我可以使用类似
的内容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 克里斯托夫
答案 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_if
和mutate_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")))