我被一些最简单的事情搞得一团糟。在下面的代码中,我想只提取一个名为“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)])
答案 0 :(得分: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)
则相应 选择是NA
。i
的负界限值会导致错误。
b <- c(1,2,3)
b[ind.1]
#[1] 2 3 NA
b[ind.2]
#[1] 2 3
从设计角度来看,此处列出的其他解决方案是帮助避免此错误的不错选择。
答案 1 :(得分: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
答案 2 :(得分:0)
如果您的目标是从列中删除NA
,则还可以执行类似
c <- na.omit(a[,1])
E.g。
> x
[1] 1 2 3 NA NA
> na.omit(x)
[1] 1 2 3
attr(,"na.action")
[1] 4 5
attr(,"class")
[1] "omit"
您可以忽略这些属性 - 它们可以让您知道删除了哪些元素。