是否有一种干净/自动的方式来转换在R中以百分比格式(带有%
符号后缀)格式化的CSV值?
以下是一些示例数据:
actual,simulated,percent error
2.1496,8.6066,-300%
0.9170,8.0266,-775%
7.9406,0.2152,97%
4.9637,3.5237,29%
可以使用以下方式阅读:
junk = read.csv("Example.csv")
但所有%列都被读取为字符串并转换为因子:
> str(junk)
'data.frame': 4 obs. of 3 variables:
$ actual : num 2.15 0.917 7.941 4.964
$ simulated : num 8.607 8.027 0.215 3.524
$ percent.error: Factor w/ 4 levels "-300%","-775%",..: 1 2 4 3
但我希望它们是数值。
read.csv还有其他参数吗?有没有办法轻松过帐所需的列以转换为数值?其他解决方案?
注意:当然在这个例子中我可以简单地重新计算这些值,但是在我的实际应用程序中使用更大的数据文件这是不切实际的。
答案 0 :(得分:10)
R中没有“百分比”类型。所以你需要做一些后期处理:
DF <- read.table(text="actual,simulated,percent error
2.1496,8.6066,-300%
0.9170,8.0266,-775%
7.9406,0.2152,97%
4.9637,3.5237,29%", sep=",", header=TRUE)
DF[,3] <- as.numeric(gsub("%", "",DF[,3]))/100
# actual simulated percent.error
#1 2.1496 8.6066 -3.00
#2 0.9170 8.0266 -7.75
#3 7.9406 0.2152 0.97
#4 4.9637 3.5237 0.29
答案 1 :(得分:2)
除了使用stringr
包之外,这与Roland的解决方案相同。使用字符串时我会推荐它,因为界面更直观。
library(stringr)
d <- str_replace(junk$percent.error, pattern="%", "")
junk$percent.error <- as.numeric(d)/100
答案 2 :(得分:1)
使用data.table
,您可以实现
a <- fread("file.csv")[,`percent error` := as.numeric(sub('%', '', `percent error`))/100]
答案 3 :(得分:0)
Tidyverse有多种方法可以解决这些问题。您可以使用parse_number()规范,它将删除任何符号,文本等数字:
sample_data = "actual,simulated,percent error\n 2.1496,8.6066,-300%\n 0.9170,8.0266,-775%\n7.9406,0.2152,97%\n4.9637,3.5237,29%"
DF <- read_csv(sample_data,col_types = cols(`percent error`= col_number()))
# A tibble: 4 x 3
# actual simulated `percent error`
# <chr> <dbl> <dbl>
# 1 2.1496 8.61 -300
# 2 + 0.9170 8.03 -775
# 3 + 7.9406 0.215 97.0
# 4 + 4.9637 3.52 29.0