-1

私は単純なデータフレームを持っています:

> 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 です。具体的には、データ フレームの抽出を観察しようとしていますが、NA を含む行を除外しています。あらゆるアドバイスをいただければ幸いです。

4

2 に答える 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"
于 2016-07-13T15:18:23.207 に答える
2

問題は、 ではなく!is.na(df$x)に索引付けされていることです。は最初の 10 要素に当てはまります。したがって、の要素 2 から 11 の行名を返します。dfdf[c(2:20)!is.na(df$x)rownames(df[c(2:20),][!is.na(df$x),])df

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

# [1] "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
于 2016-07-13T15:26:21.800 に答える