2011-09-24 94 views
9

你怎么会在R阅读此数据集,问题是 的数字是漂浮和像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 

你会如何加载这个数据集的Kinf所以它有3列。

如果我做

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

它会返回6列,而不是3 ...

+3

不要忘记告诉发送给您的Excel猴在保存CSV文件时不要使用与它们的小数点标记相同的分隔符。 – Spacedman

+0

是的。我会telll – cMinor

回答

4

这可能是最好的变换该输入数据在浮点数中使用小数点而不是逗号。你可以做到这一点的方法之一是使用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) 
+0

当然,您可以使用任何足够强大的搜索和替换工具来完成数据转换。 –

0

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

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=".")) 
          })) 
4

下面是使用三个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=参数。

相关问题