使用mutate_at更改多个列类型

时间:2016-09-01 19:45:07

标签: r dplyr

我尝试使用dplyr来整理数据集。我想要更改的列有一个字符串,它实际上是一个双字母,但是用逗号代替小数点。到目前为止我得到了这个:

presupuesto_2016 <- read_csv( "http://datos.gob.ar/dataset/89f1a2dd-ad79-4211-87b4-44661d81ac0d/resource/84e23782-7d52-4724-a4ba-2f9621fa5f4e/download/presupuesto-2016.csv")

names(presupuesto_2016) <- str_replace(names(presupuesto_2016), "\uFEFF", "")

presupuesto_2016 %>%
  mutate_at(starts_with("monto_"),
            str_replace, pattern = ",", replacement = "\\.") %>% 
  mutate_at(starts_with("monto_"), funs(as.numeric))

但是这设法将每一列都改为数字。我在这里做错了什么?

2 个答案:

答案 0 :(得分:21)

如果您想使用mutate_at和列选择辅助函数,必须将它们包含在vars函数中才能正常工作,请查看?mutate_at

presupuesto_2016 %>%
  mutate_at(vars(starts_with("monto_")),
  #         ^^^ 
            str_replace, pattern = ",", replacement = "\\.") %>% 
  mutate_at(vars(starts_with("monto_")), funs(as.numeric))
  #         ^^^ 

答案 1 :(得分:6)

为什么不这样做:

URL <- "http://datos.gob.ar/dataset/89f1a2dd-ad79-4211-87b4-44661d81ac0d/resource/84e23782-7d52-4724-a4ba-2f9621fa5f4e/download/presupuesto-2016.csv"
presupuesto_2016 <- read_csv(URL, locale=locale(decimal_mark=","))

另外,我建议你这样做:

fil <- basename(URL)
if (!file.exists(fil)) download.file(URL, fil)
presupuesto_2016 <- read_csv(fil, locale=locale(decimal_mark=","))

节省您和该网站的带宽,加快未来的处理速度,并确保在网站离线或您离线时再现。