【问题标题】:Replace % and comma in data frame替换数据框中的 % 和逗号
【发布时间】:2018-10-29 15:33:43
【问题描述】:
 dat <- structure(list(V1 = structure(c(3L, 4L, 1L, 5L, 6L, 1L, 1L, 1L, 1L, 1L), 
                      .Label = c("0,0%", "0,5%", "0,6%", "1,0%", "1,2%", "2,0%", "2,1%", "2,4%", 
                                 "3,0%", "3,3%", "4,0%", "5,0%", "7,0%"), class = "factor"), 
                       V2 = structure(c(6L, 7L, 5L, 7L, 7L, 7L, 1L, 1L, 1L, 1L), 
                          .Label = c("0,0%", "12,0%", "2,0%", "2,8%", "3,0%", "3,6%", "4,0%", "4,3%", 
                                            "5,0%", "6,0%", "6,4%", "7,0%", "7,9%", "8,0%"), class = "factor"), 
                       V3 = structure(c(3L, 6L, 2L, 16L, 2L, 14L, 1L, 1L, 1L, 1L), 
                          .Label = c("0,0%", "10,0%", "11,7%", "11,9%", "12,0%", "13,0%", "14,0%", "15,0%",
                                            "18,0%", "18,9%", "25,0%", "30,0%", "7,0%", "8,0%", "9,0%", "9,1%"), class = "factor"), 
                       V4 = structure(c(8L, 9L, 4L, 5L, 7L, 3L, 2L, 2L, 2L, 2L), 
                          .Label = c("0,5%", "1,0%","12,0%", "14,0%", "14,3%", "15,0%", "16,0%", "16,3%", "18,0%", 
                                            "19,4%", "20,0%", "22,0%", "22,4%", "23,0%", "25,0%", "28,0%", 
                                            "28,5%", "30,0%", "35,0%", "50,0%"), class = "factor")), 
                    row.names = c(NA, 10L), class = "data.frame")

我想做两件事: 1)删除,与十进制. 2)删除%符号

sapply(dat, function(x) as.numeric(gsub("%", "", x))) 
sapply(dat, function(x) as.numeric(gsub(",", ".", x)))

他们都给了我 NA。我在这里做错了什么?

【问题讨论】:

  • 如果这是您已读到 R 的数据,还要注意 read.table 中的 dec 参数

标签: r regex dataframe


【解决方案1】:

我想我会添加一个 tidyverse 方法:

library(tidyverse)
dat <- dat %>%
    map_df(str_replace, pattern = ",", replacement = ".") %>% 
    map_df(str_remove, pattern = "%") %>% 
    map_df(as.numeric)

绝对不是最快的方法:

mbm <- microbenchmark::microbenchmark(lap = {lapply(dat, function(x) 
                             as.numeric(gsub("%", "", gsub(",", "", x))))},
                  tidy = {dat %>%
                      map_df(str_replace, pattern = ",", replacement = ".") %>% 
                      map_df(str_remove, pattern = "%") %>% 
                      map_df(as.numeric)})

这表明使用 lapply 而不是我的 tidyverse 方法快了大约 10 倍,但对于某些人来说可能更难理解。

【讨论】:

    【解决方案2】:

    我们需要一步完成,因为在删除% 后转换为numeric 仍然是character 向量,因为有,。所以,只有在完成这两个操作后才使用as.numeric

    dat[] <- lapply(dat, function(x) as.numeric(gsub("%", "", gsub(",", ".", x))))
    

    如果我们使用tidyverse

    library(tidyverse)
    dat %>%
        mutate_all(funs(parse_number(str_replace(., ",", "."))))
    

    【讨论】:

    • 我们可以一次搞定:lapply(dat, function(x) as.numeric(gsub(",|%", "", x)))
    • @JilberUrbina 是的,如果 OP 不想替换为 .
    • parse_number(., locale = locale(decimal_mark = ","))
    猜你喜欢
    • 2018-08-11
    • 2021-03-03
    • 2022-11-19
    • 2021-05-17
    • 2014-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多