将 "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%")
这里有一个 dplyr
和 readr
的解决方案:
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
。
此方法的一个好处是它会检测具有 %
的列并仅解析这些列。无需提前知道哪些列需要转换。
我正在将 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%")
这里有一个 dplyr
和 readr
的解决方案:
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
。
此方法的一个好处是它会检测具有 %
的列并仅解析这些列。无需提前知道哪些列需要转换。