4

次のようなサンプル データセットがあります。

 8  02-Model (Minimum)
250.04167175293  17.4996566772461
250.08332824707  17.5000038146973
250.125  17.5008907318115
250.16667175293  17.5011672973633
250.20832824707  17.5013771057129
250.25   17.502140045166
250.29167175293  17.5025615692139
250.33332824707  17.5016822814941
 7  03 (Maximum)
250.04167175293  17.5020561218262
250.08332824707  17.501148223877
250.125  17.501127243042
250.16667175293  17.5012378692627
250.20832824707  17.5016021728516
250.25   17.5024681091309
250.29167175293  17.5043239593506

データ ファイルの最初の列は、その特定のデータの行数を意味します (つまり、02-MODEl (最小))。次に、8 行の後に別の行7 03 (Maximum)があります。これは、03 (最大) の場合、7 行のデータがあることを意味します。

私が書いた関数は次のとおりです。

readts <- function(x)
{
  path <- x
  # Read the first line of the file
  hello1 <- read.table(path, header = F, nrows = 1,sep="\t")
  tmp1 <- hello1$V1
  # Read the data below first line
  hello2 <- read.table(path, header = F, nrows = (tmp1), skip = 1, 
                       col.names = c("Time", "value"))
  hello2$name <- c(as.character(hello1$V2))
  # Read data for the second chunk
  hello3 <- read.table(path, header = F, skip = (tmp1 + 1), 
                       nrows = 1,sep="\t")
  tmp2 <- hello3$V1
  hello4 <- read.table(path, header = F, skip = (tmp1 + 2), 
                       col.names = c("Time", "value"),nrows=tmp2)
  hello4$name <- c(as.character(hello3$V2))
  # Combine data to create a dataframe
  df <- rbind(hello2, hello4)
  return(df)
}

私が得る出力は次のとおりです。

> readts("jdtrial.txt")
       Time    value               name
1  250.0417 17.49966 02-Model (Minimum)
2  250.0833 17.50000 02-Model (Minimum)
3  250.1250 17.50089 02-Model (Minimum)
4  250.1667 17.50117 02-Model (Minimum)
5  250.2083 17.50138 02-Model (Minimum)
6  250.2500 17.50214 02-Model (Minimum)
7  250.2917 17.50256 02-Model (Minimum)
8  250.3333 17.50168 02-Model (Minimum)
9  250.0417 17.50206       03 (Maximum)
10 250.0833 17.50115       03 (Maximum)
11 250.1250 17.50113       03 (Maximum)
12 250.1667 17.50124       03 (Maximum)
13 250.2083 17.50160       03 (Maximum)
14 250.2500 17.50247       03 (Maximum)
15 250.2917 17.50432       03 (Maximum)

jdtrial.txt は、上に示したデータです。ただし、複数のセパレーターを含む大きなデータがある場合、関数が機能せず、さらに行を追加する必要があるため、関数がより面倒になります。このようなデータ ファイルを読み取る簡単な方法はありますか? ありがとう。

期待されるデータは、私が得たデータです。あなたが試すことができるデータ:

 8  02-Model (Minimum)
250.04167175293  17.4996566772461
250.08332824707  17.5000038146973
250.125  17.5008907318115
250.16667175293  17.5011672973633
250.20832824707  17.5013771057129
250.25   17.502140045166
250.29167175293  17.5025615692139
250.33332824707  17.5016822814941
 7  03 (Maximum)
250.04167175293  17.5020561218262
250.08332824707  17.501148223877
250.125  17.501127243042
250.16667175293  17.5012378692627
250.20832824707  17.5016021728516
250.25   17.5024681091309
250.29167175293  17.5043239593506
 8  04-Model (Maximum)
250.04167175293  17.5020561218262
250.08332824707  17.501148223877
250.125  17.501127243042
250.16667175293  17.5012378692627
250.20832824707  17.5016021728516
250.25   17.5024681091309
250.29167175293  17.5043239593506
250.33332824707  17.5055828094482
4

4 に答える 4

3

複数のセパレーターが何を指しているのかは明確ではありませんが、実際に示したデータに対処するソリューションを次に示します。

を使用してデータを読み込み、fill=TRUE空のフィールドに入力します。を使用して、どの行がヘッダーであるかを追跡しis.hdrます。数値に変換します (警告が生成されないようにヘッダー行をにV2置き換えます)。次に、次の 2 つの列でヘッダー以外の行を NA に置き換え、(リンク)を使用して NA にヘッダーを入力します。最後に、ヘッダー以外の行のみを保持します。V2NAna.locf

library(zoo)
DF <- read.table("jdtrial.txt", fill = TRUE, as.is = TRUE)

is.hdr <- DF$V3 != ""
transform(DF, 
    V2 = as.numeric(replace(V2, is.hdr, NA)),
    V3 = na.locf(ifelse(is.hdr, V2, NA)),
    name = na.locf(ifelse(is.hdr, V3, NA)))[!is.hdr, ]

最後のステートメントの結果は次のとおりです。

         V1       V2       V3      name
2  250.0417 17.49966 02-Model (Minimum)
3  250.0833 17.50000 02-Model (Minimum)
4  250.1250 17.50089 02-Model (Minimum)
5  250.1667 17.50117 02-Model (Minimum)
6  250.2083 17.50138 02-Model (Minimum)
7  250.2500 17.50214 02-Model (Minimum)
8  250.2917 17.50256 02-Model (Minimum)
9  250.3333 17.50168 02-Model (Minimum)
11 250.0417 17.50206       03 (Maximum)
12 250.0833 17.50115       03 (Maximum)
13 250.1250 17.50113       03 (Maximum)
14 250.1667 17.50124       03 (Maximum)
15 250.2083 17.50160       03 (Maximum)
16 250.2500 17.50247       03 (Maximum)
17 250.2917 17.50432       03 (Maximum)
19 250.0417 17.50206 04-Model (Maximum)
20 250.0833 17.50115 04-Model (Maximum)
21 250.1250 17.50113 04-Model (Maximum)
22 250.1667 17.50124 04-Model (Maximum)
23 250.2083 17.50160 04-Model (Maximum)
24 250.2500 17.50247 04-Model (Maximum)
25 250.2917 17.50432 04-Model (Maximum)
26 250.3333 17.50558 04-Model (Maximum)
于 2013-07-12T03:08:05.550 に答える
1

を使用してデータを読み取り、データreadLinesの各チャンクを順番に実行します。これにより、モデル名について推測したり、正規表現をいじったりする必要がなくなります。とは対照的にループを使用する必要があります[sl]applyが、実際には何も問題はありません。

readFile <- function(file)
{
    con <- readLines(file)
    i <- 1
    chunks <- list()
    while(i < length(con))
    {
        type <- scan(text=con[i], what=character(2), sep="\t")
        nlines <- as.numeric(type[1])
        dat <- cbind(read.delim(text=con[i+seq_len(nlines)], header=FALSE),
                     type=type[2])
        chunks <- c(chunks, list(dat))
        i <- i + nlines + 1
    }
    do.call(rbind, chunks)
}
于 2013-07-12T02:31:29.253 に答える