1

助けてくれてありがとう。本質的に、私はこれに出くわしたとき、ウェブサイトからデータを取得することをテストしていました: http://lib.stat.cmu.edu/datasets/sleep。私は次のように進めました。

(A) データの感覚をつかむ (R で): 基本的に次のように入力しました

readLines("http://lib.stat.cmu.edu/datasets/sleep", n=100)

(B) 必要なデータが実際には 51 行目から始まることに気付いたので、次のコードを記述します。

sleep_table <- read.table("http://lib.stat.cmu.edu/datasets/sleep", header=FALSE, skip=50)

(C) 次のエラーが表示されます。

Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings,  : 
line 1 did not have 14 elements

上記のアプローチを得たのは、スタック オーバーフローに関する別の質問 ( import dat file into R ) からでした。ただし、この質問は .dat ファイルを扱っており、私の質問は特定の URL のデータに関するものです。私が知りたいのは、51 行目 (readLines を使用した場合) からヘッダーなしのデータフレームにデータを取得する方法です (後で colnames(sleep_table) <- c("etc で追加します) ."、"etc2"、"etc3"...)。

4

2 に答える 2

3

"Lesser short-tailed srew" と "Pig" には区切りスペースの数が等しくなく、他のフィールドはタブで区切られていないため、read.table は役に立ちません。しかし幸いなことに、これは固定スペースのようです。レコードの最後にいくつかの厄介な行があり、おそらく文字を数値に変換する必要があるため、解決策は完全ではないことに注意してください。ただし、それは簡単な演習として残されています。

# 123456789012345689012345678901234568901234567890123456890123456789012345689012345678901234568901234567890123456890
# African elephant         6654.000 5712.000  -999.0  -999.0     3.3    38.6   645.0       3       5       3
# African giant pouched rat   1.000    6.600     6.3     2.0     8.3     4.5    42.0       3       1       3
sleep_table <- read.fwf("http://lib.stat.cmu.edu/datasets/sleep", widths = c(25,rep(8,10)),
                          header=FALSE, skip=51)
于 2013-05-29T16:51:38.990 に答える
3

適切な行が 1 桁のフィールドで終わり、最初のフィールドを除くすべてのフィールドが数値であるという事実を使用します。

URL <- "http://lib.stat.cmu.edu/datasets/sleep"
L <- readLines(URL)

# lines ending in a one digit field
good.lines <- grep(" \\d$", L, value = TRUE)

# insert commas before numeric fields
lines.csv <- gsub("( [-0-9.])", ",\\1", good.lines)

# re-read
DF <- read.table(text = lines.csv, sep = ",", as.is = TRUE, strip.white = TRUE, 
         na.strings = "-999.0")

見出しにも興味がある場合は、そのためのコードを次に示します。見出しに興味がない場合は、残りを省略してください。

# get headings - of the lines starting at left edge these are the ncol(DF) lines
#  starting with the one containing "species"
headings0 <- grep("^[^ ]", L, value = TRUE)
i <- grep("species", headings0)
headings <- headings0[seq(i, length = ncol(DF))]

# The headings are a bit long so we shorten them to the first word
names(DF) <- sub(" .*$", "", headings)

これは与える:

> head(DF)
                    species     body  brain slow paradoxical total maximum
1          African elephant 6654.000 5712.0   NA          NA   3.3    38.6
2 African giant pouched rat    1.000    6.6  6.3         2.0   8.3     4.5
3                Arctic Fox    3.385   44.5   NA          NA  12.5    14.0
4    Arctic ground squirrel    0.920    5.7   NA          NA  16.5      NA
5            Asian elephant 2547.000 4603.0  2.1         1.8   3.9    69.0
6                    Baboon   10.550  179.5  9.1         0.7   9.8    27.0
  gestation predation sleep overall
1       645         3     5       3
2        42         3     1       3
3        60         1     1       1
4        25         5     2       3
5       624         3     5       4
6       180         4     4       4

更新: 空白のトリミングのマイナーな簡素化

更新 2: 見出しを短くする

更新 3: 追加na.strings = "-999.0"

于 2013-05-29T17:03:50.793 に答える