将 "X%" 格式的百分比读入 R

Reading "X%"-formatted percentages into R

我正在将 CSV 读入 R,其中有几列包含百分比,这些百分比被格式化为文本字符串,末尾有一个百分比符号,例如“35%”。 readr::read_csv() 将这些解释为字符类型数据,但我希望数据是数字,以便我可以执行分析。

下面的代码实现了这一点,但似乎有很多“障碍”需要跳过。是否有做同样事情的标准函数(或函数的选项)? read_csv() 函数中似乎没有相关选项。

convert_percentage_string <- function(percentage_string) {
  percentage_string %>%
    stringr::str_extract(., "[0-9]+") %>%
    as.numeric()
}

read_csv("my_data.csv") %>% 
  mutate_at(columns_with_percentages, convert_percentage_string)

示例数据:

tribble(~name, ~count, ~percentage, 
   "Alice", 4, "40%", 
   "Bob", 10, "65%", 
   "Carol", 15, "15%")

预期结果:

tribble(~name, ~count, ~percentage, 
       "Alice", 4, 40, 
       "Bob", 10, 65, 
       "Carol", 15, 15)

在使用 gsub:

df$percentage <- sapply(gsub("(?<=\d)%", "", df$percentage, perl = T), as.numeric)

或者,如果您更喜欢 stringr 操作:

df$percentage <- sapply(str_extract(df$percentage, "\d+"), as.numeric)

结果:

df
# A tibble: 3 x 3
  name  count percentage
  <chr> <dbl>      <dbl>
1 Alice     4         40
2 Bob      10         65
3 Carol    15         15

数据:

df <- tribble(~name, ~count, ~percentage, 
        "Alice", 4, "40%", 
        "Bob", 10, "65%", 
        "Carol", 15, "15%")

这里有一个 dplyrreadr 的解决方案:

library(dplyr) # Version >= 1.0.0
library(readr)
library(stringr)
data %>% 
   mutate(across(where(~any(str_detect(.,"%"))), parse_number))
# A tibble: 3 x 3
  name  count percentage
  <chr> <dbl>      <dbl>
1 Alice     4         40
2 Bob      10         65
3 Carol    15         15

如果您愿意,请随时将 any 替换为 all

此方法的一个好处是它会检测具有 % 的列并仅解析这些列。无需提前知道哪些列需要转换。