2014-11-15 31 views
1

我試圖函數read.table做在R. 我的數據(txt文件)是這樣的:問題讀取表中的R

a b c d e 
Australia 1 2 4 3 2 
United States 1 2 4 2 2 

的與閱讀此表的問題是:

1)第1行只有5個元件(〜e)中,而不是在下面的所有行6個元素。它應該有像「國家」這樣的列名。然後,a對應於第一個數字1,b對應於2,..並且e對應於2(在澳大利亞的情況下)。如何向第一列添加列名,以便R不會顯示錯誤說「第1行沒有6個元素」?

2)在美國的情況下,美國是兩個詞,而不是一個,這樣當R讀取數據,它把「國家」送入第二塔,而不是讀「美國」作爲一個元素名稱。

(我一直在勸我的朋友使用rownames。有誰知道如何去使用rownames ??)

我怎樣才能解決這些問題,並正確地讀我的數據?

非常感謝!

+0

什麼是源或數據?純文本文件?電子表格? – A5C1D2H2I1M1N2O1R2T1

+0

純文本文件! @AnandaMahto – Betty

+0

輸出應該是什麼樣子?你試過了什麼代碼? –

回答

1

假設示例數據模仿文件中的內容,我們可以使用readLines來讀取它,然後使用regexcountry names與其他文件分開。分隔的國家名稱可以添加爲新列。

lines <- readLines('Betty2.txt') 
lines 
#[1] "a b c d e"    "Australia 1 2 4 3 2"  
#[3] "United States 1 2 4 2 2" 

dat <- read.table(text=c(lines[1], gsub('[A-Za-z]+\\s+', '', 
       lines[-1])), header=TRUE) 

在上面的代碼中,我們替換了character元素後跟空格。即。國名與''

i.e 

gsub('[A-Za-z]+\\s+', '', lines[-1]) 
#[1] "1 2 4 3 2" "1 2 4 2 2" 

dat1 <- data.frame(Country= gsub(" \\d+.*", '', lines[-1]), 
           dat, stringsAsFactors=FALSE) 

類似地,我們在這裏取代了space後跟數(\\d+),隨後一個或多個字符與.*''

gsub(" \\d+.*", '', lines[-1]) 
#[1] "Australia"  "United States" 


dat1 
#  Country a b c d e 
#1  Australia 1 2 4 3 2 
#2 United States 1 2 4 2 2 
+0

它的工作原理!你能解釋你的第三和第四行代碼嗎?我不太瞭解它。謝謝! – Betty

+0

@Betty是的,我會在帖子上更新。 – akrun

+0

我明白了。它現在是有道理的! 「lines [-1]」在這裏做什麼? – Betty

2

這是另一種可能性。這一次增加了引號,任何兩個詞開頭的字符串

x <- readLines("your.txt") 
x[1] <- paste("Country", x[1]) 
read.table(text=sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x), header=TRUE) 
#   Country a b c d e 
# 1  Australia 1 2 4 3 2 
# 2 United States 1 2 4 2 2 

關於@ akrun的約含有兩個以上的詞國家評論,我認爲這將工作:

x[4] <- 'Papua New Guinea 3 4 3 2 5' 
xx <- sub("([A-Za-z]{2,}(\\s[A-Za-z]{2,})+)", "'\\1'", x) 
read.table(text = xx, header = TRUE) 
#   Country a b c d e 
# 1  Australia 1 2 4 3 2 
# 2 United States 1 2 4 2 2 
# 3 Papua New Guinea 3 4 3 2 5 

也發生我國名可能是數據框的行名稱。如果是這樣,那麼你可以做

x <- readLines("your.txt") 
read.table(text = sub("([A-Za-z]{2,}\\s[A-Za-z]{2,})", "'\\1'", x)) 
#    a b c d e 
# Australia  1 2 4 3 2 
# United States 1 2 4 2 2 
+0

'爲'quote'部分。 – akrun

+0

雖然我喜歡它,但這需要修改如果'x [4] < - '巴布亞新幾內亞3 4 3 2 5'' – akrun

+1

@akrun - 謝謝,我認爲這個更新現在可以用於很多單詞,我至少可以使用4個 –