0

CSV ファイルがあるとします。ファイルの各行には、数値、ベクトル、および日付があります。セミコロンで区切られた各ベクトルの要素。たとえば、この csv ファイルのベクトル y は ";1;2;4;7;2" のようになります。ベクトルの長さが異なります。を使用してこのファイルを読み取ることができませんでした

read.table() 

また

read.csv()

ここに書かれていることと同様のことを試しても、アポストロフィを含む .csv ファイルを R に読み込む方法は? . 以下は、CSV ファイルの 3 行がどのように見えるかを簡略化したものです。

1,6,;2;3.1;45;31.2;3,2,;1;1;1;1;1;5,10/22/1938 1:25
2,5,;1;22;12;1.4;66,7,;2;3;4;5;6;7;8;6;9,11/25/1938 1:25
3,1,;1;2;3;4;5;6;7;8;9,3.2,;1;2;3;4;5;6;7;9;10;11,11/25/1958 1:25

ここでは、カンマの間にスペースを入れて、もう少し読みやすくしています

1, 6, ;2;3.1;45;31.2;3, 2, ;1;1;1;1;1;5, 10/22/1938 1:25
2, 5, ;1;22;12;1.4;66, 7, ;2;3;4;5;6;7;8;6;9, 11/25/1938 1:25
3, 1, ;1;2;3;4;5;6;7;8;9, 3.2, ;1;2;3;4;5;6;7;9;10;11, 11/25/1958 1:25

各行には同じ数の ',' があります。行間の唯一の大きな違いは、ベクトルが異なる可能性があることです。フィールドが空白の場合があることに注意してください。出力がリストのリストの形式であることが最も理にかなっていると思います。私は効果的に次のような独自の関数を作成することを考えていました(私はまだリストに精通していないので、私の言語はここから離れている可能性があります)

data <- empty list of a list
while (we haven't reached the end of the file){ #don't know the function to do this
  temp = get first line of file #don't know the function to do this
  if temp is not empty{ #don't know the function to do this
    indices = which(temp==',')
    indices.col = which(temp==';')
    put temp[1:(indices(1)-1)] in the (counter,1) location of data;
    put temp[(indices(1)+1):(indices(2)-1)] in the (counter,2) location of data; 
    store the vector and deal with the colons somehow in (counter,3) location of data;
  }
}

おそらく私が見逃した方法で read.table を使用して、これを行う簡単な方法はありますか。これを行うためにリストのリストを使用するつもりはありません。基本的に、y=mx+b という形式の回帰分析を行いたいと考えています。ここで、x は数値エントリの 1 つ、y はベクトル エントリの 1 つに適用される関数のスカラー出力です (例: sum(vector) = a*行の最初のエントリ + b)。だから多分それを覚えておいてください。また、このファイルでセミコロン以外の文字を使用してベクトルを区切るオプションがあることにも注意してください。

4

2 に答える 2

2

あなたが探しているものをまだ正確に知らないので、ここに提案があります。

G. Grothendieck の回答の DF から始めます。

### Optional cleanup to remove the leading semicolon.
### Not doing so will result in a couple of empty columns.
DF$V3 <- gsub("^;", "", DF$V3)
DF$V5 <- gsub("^;", "", DF$V5)

concat.split.multiple(1) 一度に複数の列を分割できるため、「splitstackshape」パッケージから提案します。(2) 各列は異なる区切り文字を持つことができます。(3) 分割データの「ワイド」または「ロング」プレゼンテーションのオプションがあります。長い形式は、「reshape2」パッケージのようなツールを使用してさらに操作できmeltdcast後で他のことを行うための柔軟性が大幅に向上します。

library(splitstackshape)
concat.split.multiple(DF, c("V3", "V5"), ";")
#   V1 V2  V4              V6 V3_1 V3_2 V3_3 V3_4 V3_5 V3_6 V3_7 V3_8 V3_9 V5_1
# 1  1  6 2.0 10/22/1938 1:25    2  3.1   45 31.2    3   NA   NA   NA   NA    1
# 2  2  5 7.0 11/25/1938 1:25    1 22.0   12  1.4   66   NA   NA   NA   NA    2
# 3  3  1 3.2 11/25/1958 1:25    1  2.0    3  4.0    5    6    7    8    9    1
#   V5_2 V5_3 V5_4 V5_5 V5_6 V5_7 V5_8 V5_9 V5_10
# 1    1    1    1    1    5   NA   NA   NA    NA
# 2    3    4    5    6    7    8    6    9    NA
# 3    2    3    4    5    6    7    9   10    11
out <- concat.split.multiple(DF, c("V3", "V5"), ";", "long")

head(out)
#   V1 V2  V4              V6 time V3 V5
# 1  1  6 2.0 10/22/1938 1:25    1  2  1
# 2  2  5 7.0 11/25/1938 1:25    1  1  2
# 3  3  1 3.2 11/25/1958 1:25    1  1  1
# 4  1  6 2.0 10/22/1938 1:25    2 NA NA
# 5  2  5 7.0 11/25/1938 1:25    2 NA NA
# 6  3  1 3.2 11/25/1958 1:25    2 NA 11
于 2013-11-04T17:00:39.783 に答える
1

を使って読んでくださいread.csv。次に、列 3 と 5 を再度読み取って、それぞれの行列を作成し、それらの列をそれらの行列に置き換えることができます。つまり、列 3 が行列になりstr、最後の出力で示されるように列 5 も行列になります。

Lines <- "1,6,;2;3.1;45;31.2;3,2,;1;1;1;1;1;5,10/22/1938 1:25
2,5,;1;22;12;1.4;66,7,;2;3;4;5;6;7;8;6;9,11/25/1938 1:25
3,1,;1;2;3;4;5;6;7;8;9,3.2,;1;2;3;4;5;6;7;9;10;11,11/25/1958 1:25
"

DF <- read.csv(text = Lines, header = FALSE, as.is = TRUE)
DF2 <- transform(DF,
       V3 = as.matrix(read.table(text = V3, sep = ";", fill = TRUE)),
       V5 = as.matrix(read.table(text = V5, sep = ";", fill = TRUE))
    )

str出力。列 3 と 5 のそれぞれが行列であることに注意してください。

> str(DF2)
'data.frame':   3 obs. of  6 variables:
 $ V1: int  1 2 3
 $ V2: int  6 5 1
 $ V3: num [1:3, 1:10] NA NA NA 2 1 1 3.1 22 2 45 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "V1" "V2" "V3" "V4" ...
 $ V4: num  2 7 3.2
 $ V5: int [1:3, 1:11] NA NA NA 1 2 1 1 3 2 1 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr  "V1" "V2" "V3" "V4" ...
 $ V6: chr  "10/22/1938 1:25" "11/25/1938 1:25" "11/25/1958 1:25"

また、平らにしたい場合は、次のことを試してください。

 DF.flat <- do.call(data.frame, DF2)

追加: 平らにする方法。

于 2013-11-04T05:30:15.200 に答える