R:NA 返回尽管 !is.na
R: NA returned despite !is.na
我有一个简单的数据框:
> 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"
到目前为止一切顺利。现在我想跳过第一行,但由于某种原因,命令 returns 输出相同的长度,现在甚至包含一个 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 的行。我会很高兴收到每条建议!
我们可以直接从逻辑输出
中提取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"
问题是 !is.na(df$x)
被索引到 df
,而不是 df[c(2:20)
。 !is.na(df$x)
前 10 个元素为真。因此,rownames(df[c(2:20),][!is.na(df$x),])
returns df
的元素 2 到 11 的行名。
df2 <- df[c(2:20),]
rownames(df2[!is.na(df2$x),])
# [1] "2" "3" "4" "5" "6" "7" "8" "9" "10"
我有一个简单的数据框:
> 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"
到目前为止一切顺利。现在我想跳过第一行,但由于某种原因,命令 returns 输出相同的长度,现在甚至包含一个 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 的行。我会很高兴收到每条建议!
我们可以直接从逻辑输出
中提取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"
问题是 !is.na(df$x)
被索引到 df
,而不是 df[c(2:20)
。 !is.na(df$x)
前 10 个元素为真。因此,rownames(df[c(2:20),][!is.na(df$x),])
returns df
的元素 2 到 11 的行名。
df2 <- df[c(2:20),]
rownames(df2[!is.na(df2$x),])
# [1] "2" "3" "4" "5" "6" "7" "8" "9" "10"