0

非常に単純な質問です。列見出しに 2 つの行がある Excel シートを使用しています。これらの 2 つの行見出しを 1 つに変換するにはどうすればよいですか? さらに、これらの見出しはシートの先頭から始まりません。

したがって、私はDF1を持っています

Temp Press  Reagent  Yield A  Conversion etc
degC bar    /g       %        %             
1    2      3        4        5          
6    7      8        9        10

そして、私は欲しい、

Temp degC Press bar  Reagent /g  Yield A % Conversion etc
1         2          3           4         5          
6         7          8           9        10

colnames(DF1) を使用すると上の名前が返されますが、2行目を上の行とマージすることは私を避け続けています。

4

3 に答える 3

2

データを使用して、区切り記号を含むテキスト フィールドを引用するように変更します (テキスト フィールドを引用するファイルを生成するために使用したツールを入手してください!)

txt <- "Temp Press  Reagent  'Yield A'  'Conversion etc'
degC bar    /g       %        %             
1    2      3        4        5          
6    7      8        9        10
"

以下のコード スニペットは、2 つのステップでファイルを読み取ります。

  1. 最初にデータを読み取るためskip = 2、最初の 2 行をスキップすることを意味します
  2. 次に、データを再度読み取りますが、最初の 2 行のみです。この出力は、データ フレームの列の文字列によってさらに処理されsapply()ます。これらはのに割り当てられますpaste(x, collapse = " ")labsnamesdat

コードは次のとおりです。

dat <- read.table(text = txt, skip = 2)
labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
names(dat) <- sapply(labs, paste, collapse = " ")

dat
names(dat)

コードを実行すると、次のものが生成されます。

> dat <- read.table(text = txt, skip = 2)
> labs <- read.table(text = txt, nrows = 2, stringsAsFactors = FALSE)
> names(dat) <- sapply(labs, paste, collapse = " ")
> 
> dat
  Temp degC Press bar Reagent /g Yield A % Conversion etc %
1         1         2          3         4                5
2         6         7          8         9               10
> names(dat)
[1] "Temp degC"        "Press bar"        "Reagent /g"      
[4] "Yield A %"        "Conversion etc %"

あなたの場合、read.table()ファイル システム上のファイルを指すように呼び出しを変更する必要があるため、コード チャンクのfile = "foo.txt"代わりに を使用します。ここで、 はファイルの名前です。text = txt"foo.txt"

また、これらの見出しがファイルの先頭から始まらない場合は、2 つのヘッダー行のの行数skipまで増やします。また、 を生成する2 番目の呼び出しに追加する必要があります。ここで、はヘッダー行の前の行数です。2+nnskip = nread.table()labsn

于 2013-01-29T12:21:20.697 に答える
2

read.table(file, header = FALSE, stringsAsFactors = F)引数を指定してファイルをロードするだけです。次に、grepこれが発生する位置を見つけることができます。

df <- data.frame(V1=c(sample(10), "Temp", "degC"), 
                 V2=c(sample(10), "Press", "bar"), 
                 V3 = c(sample(10), "Reagent", "/g"), 
                 V4 = c(sample(10), "Yield_A", "%"), 
                 V5 = c(sample(10), "Conversion", "%"), 
                 stringsAsFactors=F)
idx <- unique(c(grep("Temp", df$V1), grep("degC", df$V1)))
df2 <- df[-(idx), ]
names(df2) <- sapply(df[idx, ], function(x) paste(x, collapse=" "))

ここで、必要に応じて、次のようにすべての列を数値に変換できます。

df2 <- as.data.frame(sapply(df2, as.numeric))
于 2013-01-29T12:21:34.580 に答える
2

これはうまくいくはずです。データを読み取るときは、stringsAsFactors=FALSE を設定するだけです。

data <- structure(list(Temp = c("degC", "1", "6"), Press = c("bar", "2", 
"7"), Reagent = c("/g", "3", "8"), Yield.A = c("%", "4", "9"), 
    Conversion = c("%", "5", "10")), .Names = c("Temp", "Press", 
"Reagent", "Yield.A", "Conversion"), class = "data.frame", row.names = c(NA, 
-3L)) # Your data

colnames(data) <-paste(colnames(dados),dados[1,]) # Set new names
data <- data[-1,] # Remove first line

data <- data.frame(apply(data,2,as.real)) # Correct the classes (works only if all collums are numbers)
于 2013-01-29T12:20:57.283 に答える