2011-09-24 163 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=參數。

相關問題