2017-09-05 52 views
0

我在R中有一個data.table,其中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.character(DT $ ID))== 4)'。我相應地更新了我的答案。 Groovy的? –

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

當我嘗試使用floor(log10(data $ ID))時,我得到錯誤'Math.factor(data $ ID)中的錯誤:'log10'對因素無意義'' nchar給我'nchar中的錯誤數據$ ID):'nchar()'需要一個字符向量' –

+0

然後在使用'nchar'之前將其轉換爲字符 –