Чтение набора данных в R, в котором запятая используется для разделителя полей и десятичной точки - PullRequest
9 голосов
/ 24 сентября 2011

Как вы могли прочитать этот набор данных в 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

Как бы вы загрузили этот набор данных в R, чтобы он имел 3 столбца.

Если я делаю

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

будет возвращено 6 столбцов вместо 3 ...

Ответы [ 3 ]

4 голосов
/ 24 сентября 2011

Может быть лучше преобразовать эти входные данные, чтобы использовать десятичные точки, а не запятые, в числах с плавающей запятой.Один из способов сделать это - использовать 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)
4 голосов
/ 25 сентября 2011

Вот решение all R, использующее три вызова read.table.Первый оператор 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=.

0 голосов
/ 24 сентября 2011

Это не красиво, но должно работать:

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="."))
                             } ))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...