2017-09-05 77 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'之前将其转换为字符 –