R 在数据表中应用函数以有条件地删除行

R 在数据表中应用函数以有条件地删除行,r,data.table,R,Data.table,我有一个数据表,dt: V1 V2 V3 PubMedCounts 1: 0000100005 100-00-5 CAS Number 6 2: 0000100005 1-Chloro-4-nitrobenzene DescriptorName 12 3: 0000100005 a

我有一个数据表,
dt

           V1                      V2             V3   PubMedCounts
1: 0000100005                100-00-5     CAS Number              6
2: 0000100005 1-Chloro-4-nitrobenzene DescriptorName             12
3: 0000100005                    aahs DescriptorName            111
4: 0000100005                    PNCB        Synonym             35
此外,我还有一个数据表,
ew
,它只有一列包含单词,如:

          V1
1:       aah
2:     aahed
3:    aahing
4:      aahs
5:  aardvark
dt
数据表中,我需要删除
V2
大小小于或等于5或出现在
ew
数据表中的所有行

例如,从
dt
表中,我将删除第3行和第4行


我想使用apply函数来提高它的效率,因为它的数据集非常大

如果我理解正确,我会:

dt[!ew, on = c(V2 = "V1")][nchar(V2) > 5]
其中:

       V1                      V2             V3 PubMedCounts
1: 100005                100-00-5     CAS_Number            6
2: 100005 1-Chloro-4-nitrobenzene DescriptorName           12
按其他顺序应用条件可能更快:

dt[nchar(V2) > 5][!ew, on = c(V2 = "V1")]
这将防止在
dt
中匹配下一步将要删除的内容

第三种可能性是使用:

dt[nchar(V2) > 5 & !( V2 %chin% ew$V1 )]

使用数据:

dt <- structure(list(V1 = c(100005L, 100005L, 100005L, 100005L), V2 = c("100-00-5", 
"1-Chloro-4-nitrobenzene", "aahs", "PNCB"), V3 = c("CAS_Number", 
"DescriptorName", "DescriptorName", "Synonym"), PubMedCounts = c(6L, 
12L, 111L, 35L)), .Names = c("V1", "V2", "V3", "PubMedCounts"
), row.names = c(NA, -4L), class = c("data.table", "data.frame"))

ew <- structure(list(V1 = c("aah", "aahed", "aahing", "aahs", "aardvark")), .Names = "V1", row.names = c(NA, -5L), class = c("data.table", "data.frame"))

dt为什么删除第四行?因为
“PNCB”<5
?所以您的意思是要删除包含4个或更少字符的字符串?是的,我的错误是,它应该小于或等于5。我编辑了这个问题谢谢@Frank&
@Jaap
,我一直在四处奔波&无法自己创建要测试的示例。