用R读取csv文件中的分数

时间:2016-10-11 18:14:19

标签: r csv fractions

我有一个带有标题的数字数据的文本文件,其中一些数字作为分数输入,一些作为整数输入,一些作为浮点输入,例如:

col1name, col2name, col3name, col4name    
1, 2, 3, 4
0.5, 0.6, 0.7, 0.8
1/2, 2/3, 3/4, 4/5
1, 0.2, 3/3, 4

当我使用read.csv时,如何评估这些表达式并将其存储为数字?

...谢谢

2 个答案:

答案 0 :(得分:7)

首先,将数据导入为字符串向量。在问题中使用您的玩具示例,我们可以通过

执行此操作
txt = "1, 2, 3, 0.3, 2/5, 0.75, 1/3"
dat = read.table(text = txt, sep = ",", stringsAsFactors = F)

将数据放入字符向量后,我们可以使用eval(parse())来评估表达式,就好像它们已在控制台中输入一样。不幸的是eval没有矢量化,所以我们将它包装成sapply,以便依次将此函数应用于数据的每个元素

answer = sapply(dat, function(x) eval(parse(text = x)))

我们可以通过一次将上述方法应用于每一列来扩展它以处理多行数据。例如,像这样

txt = "col1name, col2name, col3name, col4name
1, 2, 3, 4
0.5, 0.6, 0.7, 0.8
1/2, 2/3, 3/4, 4/5
1, 0.2, 3/3, 4"

dat = read.table(text = txt, sep = ",", stringsAsFactors = F, header = T)
answer = apply(dat, 2, function(this.col) sapply(this.col, function(x) eval(parse(text = x))))
#      col1name  col2name col3name col4name
# [1,]      1.0 2.0000000     3.00      4.0
# [2,]      0.5 0.6000000     0.70      0.8
# [3,]      0.5 0.6666667     0.75      0.8
# [4,]      1.0 0.2000000     1.00      4.0

答案 1 :(得分:1)

我强烈建议在“data.table”包中使用fread()。它几乎在所有情况下都非常快速且非常强大。

input.file <- fread("file_name.csv")

如果您的值仍然不是您要查找的格式,则可以使用“as.integer()”或“as.numeric()”:

input.file$`Column Name To Change` <- as.numeric(input.file$`Column Name To Change`)

希望这有帮助!