30

ヘッダーに必要な2行がヘッダーにある場合、ファイルをRに読み込む最良の方法は何ですか?

列名に 1 つの行を使用し、その下に測定単位として別の行を含めることがよくあるため、これは常に私に起こります。私は何もスキップしたくありません。名前もユニットも引き継いでほしい。

2 つのヘッダーを持つ典型的なファイルは次のようになります。

trt   biomass    yield
crop    Mg/ha    bu/ac
C2      17.76   205.92
C2      17.96   207.86
CC      17.72   197.22
CC      18.42   205.20
CCW     18.15   200.51
CCW     17.45   190.59
P       3.09    0.00
P       3.34    0.00
S2      5.13    49.68
S2      5.36    49.72
4

5 に答える 5

24

最初の行にラベルが含まれており、常に 2 つのヘッダーがあることがわかっていると仮定して、2 つの手順を実行します。

header <- scan("file.txt", nlines = 1, what = character())
data <- read.table("file.txt", skip = 2, header = FALSE)

次に、文字ベクトルheadernamesコンポーネントとして追加します。

names(data) <- header

あなたのデータの場合、これは

header <- scan("data.txt", nlines = 1, what = character())
data <- read.table("data.txt", skip = 2, header = FALSE)
names(data) <- header

head(data)

>     head(data)
  trt biomass  yield
1  C2   17.76 205.92
2  C2   17.96 207.86
3  CC   17.72 197.22
4  CC   18.42 205.20
5 CCW   18.15 200.51
6 CCW   17.45 190.59

@DWinの回答に従って、単位が必要な場合は、2scan()行目でもう一度実行してください

header2 <- scan("data.txt", skip = 1, nlines = 1, what = character())
names(data) <- paste0(header, header2)

> head(data)
  trtcrop biomassMg/ha yieldbu/ac
1      C2        17.76     205.92
2      C2        17.96     207.86
3      CC        17.72     197.22
4      CC        18.42     205.20
5     CCW        18.15     200.51
6     CCW        17.45     190.59
于 2013-07-22T22:02:37.420 に答える
9

他の回答とほぼ同じ方法で、2つのステートメントに短縮するだけです:

dat <- "trt   biomass    yield
crop    Mg/ha    bu/ac
C2      17.76   205.92
C2      17.96   207.86
CC      17.72   197.22
CC      18.42   205.20
CCW     18.15   200.51
CCW     17.45   190.59
P       3.09    0.00
P       3.34    0.00
S2      5.13    49.68
S2      5.36    49.72"

header <- sapply(read.table(text=dat, nrow=2), paste, collapse="_")
result <- read.table(text=dat, skip=2, col.names=header)

結果:

> head(result,2)
  trt_crop biomass_Mg/ha yield_bu/ac
1       C2         17.76      205.92
2       C2         17.96      207.86
...
于 2013-07-22T22:07:22.833 に答える