1

我对一些最简单的事情感到困惑。在下面的代码中,我想只提取名为“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)])
4

3 回答 3

4

您获得 NA 的直接原因是序列运算符: 优先于加法运算符+,如R Language Definition中所述。因此NumBars+1:length(b)不一样(NumBars+1):length(b)。第一个添加NumBars到 vector 1:length(b),而第二个先添加然后获取序列。

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

当您使用这个较长的向量进行索引时,您会获得所有想要的元素,并且您还要求输入诸如R 语言定义告诉我们返回b[length(b)+1]的条目。这就是为什么你有尾随的原因。NANA

如果i为正且超过length(x),则对应的选择为NA。负的越界值i会导致错误。

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

从设计的角度来看,此处列出的其他解决方案是帮助避免此错误的不错选择。

于 2013-05-06T18:41:00.260 回答
0

如果您的目标是从列中删除NAs,您还可以执行类似的操作

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"

您可以忽略这些属性 - 它们在那里让您知道哪些元素已被删除。

于 2013-05-06T18:38:37.020 回答
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
于 2013-05-06T18:34:09.223 回答