【问题标题】:Read dataset in R in which comma is used for field separator and decimal point读取 R 中的数据集,其中逗号用于字段分隔符和小数点
【发布时间】:2011-11-24 09:03:45
【问题描述】:

你怎么能读到R中的这个数据集,问题是 这些数字是 floats 并且就像 4,000000059604644E+16 它们由, 分隔

4,000000059604644E-16 ,  7,999997138977056E-16,   9,000002145767216E-16
4,999999403953552E-16 ,  6,99999988079071E-16 ,   0,099999904632568E-16
9,999997615814208E-16 ,  4,30000066757202E-16 ,   3,630000114440918E-16
0,69999933242798E-16  ,  0,099999904632568E-16,  55,657576767799999E-16 
3,999999761581424E-16,   1,9900000095367432E-16,  0,199999809265136E-16

如何在 R 中加载这种类型的数据集,使其具有 3 列。

如果我这样做

dataset <- read.csv("C:\\data.txt",header=T,row.names=NULL)

它将返回 6 列而不是 3...

【问题讨论】:

  • 不要忘记告诉发送给您此信息的 Excel 猴子,在保存 CSV 文件时不要使用与小数点标记相同的分隔符。

标签: r matrix load dataset


【解决方案1】:

最好将输入数据转换为在浮点数中使用小数点而不是逗号。您可以这样做的一种方法是使用 sed(看起来您使用的是 Windows,因此您可能需要 sed 才能使用这种方法):

sed 's/\([0-9]\),\([0-9]\)/\1.\2/g' data.txt  > data2.txt

文件data2 如下所示:

4.000000059604644E-16 ,  7.999997138977056E-16,   9.000002145767216E-16
4.999999403953552E-16 ,  6.99999988079071E-16 ,   0.099999904632568E-16
9.999997615814208E-16 ,  4.30000066757202E-16 ,   3.630000114440918E-16
0.69999933242798E-16  ,  0.099999904632568E-16,  55.657576767799999E-16 
3.999999761581424E-16,   1.9900000095367432E-16,  0.199999809265136E-16

然后在 R 中:

dataset <- read.csv("data2.txt",row.names=NULL)

【讨论】:

  • 当然,您可以使用任何功能强大的搜索和替换工具来对数据进行转换。
【解决方案2】:

这是一个使用三个 read.table 调用的全 R 解决方案。第一个read.table语句将每个数据行读取为6个字段;第二个read.table 语句将字段正确地重新组合在一起并读取它们,第三个从标题中获取名称。

fn <- "data.txt"

# create a test file

Lines <- "A , B , C
4,000000059604644E-16 ,  7,999997138977056E-16,   9,000002145767216E-16
4,999999403953552E-16 ,  6,99999988079071E-16 ,   0,099999904632568E-16
9,999997615814208E-16 ,  4,30000066757202E-16 ,   3,630000114440918E-16
0,69999933242798E-16  ,  0,099999904632568E-16,  55,657576767799999E-16 
3,999999761581424E-16,   1,9900000095367432E-16,  0,199999809265136E-16"
cat(Lines, "\n", file = fn)

# now read it back in

DF0 <- read.table(fn, skip = 1, sep = ",", colClasses = "character")
DF <- read.table(
   file = textConnection(do.call("sprintf", c("%s.%s %s.%s %s.%s", DF0))), 
   col.names = names(read.csv(fn, nrow = 0))
)

给出:

> DF
             A            B            C
1 4.000000e-16 7.999997e-16 9.000002e-16
2 4.999999e-16 7.000000e-16 9.999990e-18
3 9.999998e-16 4.300001e-16 3.630000e-16
4 6.999993e-17 9.999990e-18 5.565758e-15
5 4.000000e-16 1.990000e-16 1.999998e-17

注意:问题中的read.csv 语句暗示有一个标题,但示例数据没有显示。我假设有一个标题,但如果没有,则删除 skip=col.names= 参数。

【讨论】:

    【解决方案3】:

    它不漂亮,但它应该可以工作:

    x <- matrix(scan("c:/data.txt", what=character(), sep=","), byrow=TRUE, ncol=6)
    y <- t(apply(x, 1, function(a) { left <- seq(1, length(a), by=2)
                                   as.numeric(paste(a[left], a[left+1], sep="."))
                                 } ))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 2021-12-25
      • 2021-06-16
      • 1970-01-01
      • 2013-06-24
      • 2012-01-02
      • 2011-09-01
      相关资源
      最近更新 更多