【问题标题】:Reading fractions in csv file with R用R读取csv文件中的分数
【发布时间】:2017-02-20 09:21:01
【问题描述】:

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

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 时,如何评估这些表达式并将其存储为数字?

谢谢...

【问题讨论】:

  • 你能把你的文本文件的样本贴在我们可以下载的地方吗?然后我们就可以准确地看到您尝试导入的数据的结构并提供量身定制的代码。
  • @eipi 我编辑了示例以更好地显示文件的结构。

标签: r csv fractions


【解决方案1】:

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

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

【讨论】:

  • 适用于玩具示例,但不适用于包含多行数据的文本文件(它只保留最后一行)。
  • 那你需要在每一行上依次使用这个。这仍然是这样做的方法。
  • 我认为会有 - 但这就是计算机的美妙之处。它们是非常好的重复性任务。开个玩笑,我会更新答案以说明如何。
  • 伙计们,我们有一个赢家。谢谢
  • 我通过按列而不是按行操作来稍微简化。这样我们就不需要t() 在最后转置
【解决方案2】:

我强烈建议在“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`)

希望这会有所帮助!

【讨论】:

  • @BenS。分数是如何输入 csv 的?例如,为了输入我的并将它们保留在那里,我在输入分数 2/5 之前添加了一个撇号。
  • @Richard 它们不是来自 Excel 文件。只是一个纯文本文件,看起来像我作为示例给出的行。
猜你喜欢
  • 2023-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
  • 2014-09-15
  • 2011-04-19
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多