2013-05-06 69 views
1

我得到了一些最簡單的東西的flummoxed。在下面的代碼中,我想只提取名爲'a'的data.frame中的一列的一部分。我獲得了正確的價值觀,但最終的實體被填充了我不想要的新輔助資料。 'b'是提取的列,'c'是數據的正確部分,但在結尾處具有額外的NA填充。從data.frame/matrix中提取1列的一部分

我該如何最好地做到這一點,'c'最終自然只有9個元素長? (即 - 15原減去6我跳過)

NumBars = 6 
a = as.data.frame(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)) 
a[,2] = c(11,12,13,14,15,16,17,18,19,20,21,22,23,24,25) 
names(a)[1] = "Data1" 
names(a)[2] = "Data2" 

{Use 1st column of data only} 

b = as.matrix(a[,1]) 
c = as.matrix(b[NumBars+1:length(b)]) 

回答

4

你得到NA的直接原因是序列運算符:優先於加法運算符+,詳見R Language Definition。因此NumBars+1:length(b)(NumBars+1):length(b)不一樣。第一個將NumBars添加到矢量1:length(b),而第二個先添加,然後接受序列。

ind.1 <- 1+1:3 # == 2:4 
ind.2 <- (1+1):3 # == 2:3 

當您使用此不再矢量指數,你會得到你想要的所有元素,你也問了類似b[length(b)+1]項,其中R Language Definition告訴我們返回NA。這就是爲什麼你跟蹤NA的原因。

i如果爲正且超過length(x)那麼相應 選擇NAi的負向越界值會導致錯誤。

b <- c(1,2,3) 
b[ind.1] 
#[1] 2 3 NA 
b[ind.2] 
#[1] 2 3 

從設計的角度來看,這裏列出的其它解決方案都是不錯的選擇,以幫助避免這個錯誤。

+0

它可能會有幫助添加一個或兩個句子,以幫助繪製最終連接 – 2013-05-06 18:42:20

+0

@RicardoSaporta完成。謝謝。 – 2013-05-06 18:47:42

+0

我認爲裏卡多建議你顯示結果:'b [(NumBars + 1):length(b)]' – 2013-05-06 18:49:42

0

它是想你想從你的向量/矩陣刪除哪些往往更容易。使用負面下標刪除項目。

c = as.matrix(b[-1:-NumBars]) 
c 
##  [,1] 
## [1,] 7 
## [2,] 8 
## [3,] 9 
## [4,] 10 
## [5,] 11 
## [6,] 12 
## [7,] 13 
## [8,] 14 
## [9,] 15 
0

如果你的目標是從一列中刪除NA S,你也可以這樣做

c <- na.omit(a[,1]) 

例如

> x 
[1] 1 2 3 NA NA 
> na.omit(x) 
[1] 1 2 3 
attr(,"na.action") 
[1] 4 5 
attr(,"class") 
[1] "omit" 

可以忽略的屬性 - 他們在那裏讓你知道去除哪些元素。