2016-07-13 26 views
-1

にもかかわらず、返さ:R:!のNAは、私は単純なデータフレーム持って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を抽出したい:

> 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を含む行は除外しています。私はすべてのアドバイスについて満足しています!

+4

あなたのコードに関しては、 'df'が出現するたびにフィルタリングすることを忘れてしまいます。それを動作させるには 'rownames(df [2:20、] [!is.na(df [2:20、] $ x)、])'または 'rownames(df [-1、] [! is.na(df [-1、] $ x)、]) ' –

+0

ありがとう、これは実際に私のpuposeで完全に動作します。私は本当に/フィルタdfを指定することを忘れてしまった2番目の部分です! – oepix

+1

これは、2から20までのデータテーブルdf [c(2:20)]のrownamesを取り、rownames(df [c(2:20)]を参照)を返し、 "11"を含むそれらのうちの最初の10個の値。大佐がrownames(df [c(2:20)、] [!is.na(df [c(2:20)、] $ x) )も同様に動作します –

答えて

2

を使用することができ、問題が!is.na(df$x)ではdf、ないdf[c(2:20)にインデックスされます。最初の10要素については!is.na(df$x)がtrueです。したがって、​​は、dfの要素2〜11のrownamesを返します。

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

# [1] "2" "3" "4" "5" "6" "7" "8" "9" "10" 
3

私たちは、論理出力から直接

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

またはその代わりのtailrownamesを抽出することができ、我々は

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