簡體   English   中英

從data.frame / matrix中提取1列的一部分

[英]Extract a portion of 1 column from data.frame/matrix

我被一些最簡單的東西弄得暈頭轉向。 在下面的代碼中,我想只提取一個名為“a”的data.frame中的一列的一部分。 我得到了正確的值,但最后的實體用NA填充,我不想要。 'b'是提取的列,'c'是數據的正確部分,但在末尾有額外的NA填充。

如果'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)])

你獲得NA的直接原因是序列運算符:優先於加法運算符+ ,如R語言定義中所述 因此, 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語言定義告訴我們返回NA 這就是你跟隨NA的原因。

如果i為正且超過length(x)則相應的選擇為NA i負超出范圍值會導致錯誤。

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

從設計角度來看,此處列出的其他解決方案是幫助避免此錯誤的不錯選擇。

通常更容易想到要從矢量/矩陣中刪除的內容。 使用否定下標刪除項目。

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

如果您的目標是從列中刪除NA ,您也可以執行類似的操作

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"

您可以忽略這些屬性 - 它們可以讓您知道刪除了哪些元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM