我正在将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)发布于 2021-01-07 01:34:32
这是一个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如果您愿意,请随意使用all替换any。
这种方法的一个好处是它可以检测具有%的列,并且只解析这些列。不需要知道需要提前转换哪些列。
发布于 2021-01-07 01:27:28
在使用sapply从数字中删除%符号后,可以将函数as.numeric添加到percentage列
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%")https://stackoverflow.com/questions/65600364
复制相似问题