R:NA 返回尽管 !is.na

问题描述 投票:0回答:2

我有一个简单的数据框:

> df <- data.frame(i=c(1:20), x=c(1:10, rep(NA, 10)))
> df
    i  x
1   1  1
2   2  2
3   3  3
4   4  4
5   5  5
6   6  6
7   7  7
8   8  8
9   9  9
10 10 10
11 11 NA
12 12 NA
13 13 NA
14 14 NA
15 15 NA
16 16 NA
17 17 NA
18 18 NA
19 19 NA
20 20 NA

我想提取非 NA 部分的行名,我可以这样做:

> rownames(df[c(1:20),][!is.na(df$x),])
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

到目前为止一切顺利。现在我想跳过第一行,但由于某种原因,该命令返回相同长度的输出,现在甚至包含一个 NA 单元格。

> rownames(df[c(2:20),][!is.na(df$x),])
 [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11"

获得相同大小的向量甚至包含假定排除的行的向量没有意义。 正如您在上面的数据框中看到的那样,df$x[11] 绝对是 NA,那么为什么它包含 !is.na() 通常应该去除的东西呢?更具体地说:我正在尝试观察数据框的提取物,但排除包含 NA 的行。我会很高兴每一条建议!

r dataframe na r-rownames
2个回答
3
投票

我们可以直接从逻辑输出中提取

rownames

tail(rownames(df)[!is.na(df$x)], -1)
#[1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

或者代替

tail
,我们可以使用

rownames(df)[!is.na(df$x)][-1]
#[1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"

2
投票

问题是

!is.na(df$x)
被索引到
df
,而不是
df[c(2:20)
!is.na(df$x)
对于前 10 个元素是正确的。因此,
rownames(df[c(2:20),][!is.na(df$x),])
返回
df
的元素 2 到 11 的行名。

df2 <- df[c(2:20),]
rownames(df2[!is.na(df2$x),])    

# [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
© www.soinside.com 2019 - 2024. All rights reserved.