2017-09-05 8 views
0

私はをRに付けています。ここでIDは列です。 IDの一部は3桁で、一部は4桁です。 4桁ではない列だけを簡単に検査できる新しい表を作成したいと考えています。列$ IDの行だけをループして長さをテストするにはどうすればよいですか?Rテーブルサブセットの長さ条件

 Index ID age education gender relationship 
     3 6192 32  12  2   2 
     4 6191 18  NA  1   NA 
     6 8421 25  10  1   2 
     7  999 18  NA  1   NA 
     9 7612 35  12  2   1 
     10 7611 43  14  1   1 
     11 8422 51  11  2   2 
+1

のような質問にで動作するように再現可能な例を提供してくださいこれらのhttp://stackoverflow.com/help/mcve –

答えて

1
library(data.table) 
DT = data.table(x=rep(c("b","a","c"),each=3), y=c(1,3,6), v=1:9, ID=c(123,1234,123,123,123)) 
x y v ID 
1: b 1 1 123 
2: b 3 2 1234 
3: b 6 3 123 
4: a 1 4 123 
5: a 3 5 123 
6: a 6 6 123 
7: c 1 7 1234 
8: c 3 8 123 
9: c 6 9 123 
subset(DT, !nchar(DT$ID)==4) 
x y v ID 
1: b 1 1 123 
2: b 6 3 123 
3: a 1 4 123 
4: a 3 5 123 
5: a 6 6 123 
6: c 3 8 123 
7: c 6 9 123 
DT1 <- subset(DT, !nchar(DT$ID)==4) 

DT1 
x y v ID 
1: b 1 1 123 
2: b 6 3 123 
3: a 1 4 123 
4: a 3 5 123 
5: a 6 6 123 
6: c 3 8 123 
7: c 6 9 123 

最後に、IDデータタイプが文字でない場合は、DT1 <- subset(DT, !nchar(as.character(DT$ID))==4)のようにします。

+0

列がそうNCHARすべての整数であるNCHARでこのエラー 'エラー(データ$ ID)をスローします。 'nchar()'は文字ベクトルが必要です。 ' –

+0

@HeatherCohen 'as.character()'を使うことができます。私は実際に比較で使用するだけのデータ型を実際に変更するつもりはありません。 'サブセット(DT、!nchar(as。文字(DT $ ID))== 4)'。私はそれに応じて私の答えを更新しました。すごい? –

1

IDが数値の場合は、floor(log10(ID))となります。

floor(log10(c(1, 10, 11, 100, 101))) 
# [1] 0 1 1 2 2 

そしてIDは文字ベクトルである場合、ncharは、各文字列がどのくらいを教えてくれます。

nchar(c("1", "10", "11", "100", "101")) 
# [1] 1 2 2 3 3 
+0

エラー 'Math.factor(data $ ID)でエラーが発生しました。' floor(log10(data $ ID))を使用しようとすると、 'log10'は意味がありません。 ncharは '' ncharデータ$ ID): 'nchar()'は文字ベクトルが必要です。 ' –

+0

' nchar'を使う前に文字に変換してください –