如何读取R中的csv文件,其中某些值包含百分号(%)

时间:2014-01-02 22:13:15

标签: r csv

是否有一种干净/自动的方式来转换在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还有其他参数吗?有没有办法轻松过帐所需的列以转换为数值?其他解决方案?

注意:当然在这个例子中我可以简单地重新计算这些值,但是在我的实际应用程序中使用更大的数据文件这是不切实际的。

4 个答案:

答案 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