如果指定列中有“,”,则从数据框中删除行

时间:2014-11-10 13:37:43

标签: r

我想从data.frame中删除一些行。让我们从示例开始:

> tbl_EOD[20:40,]
   AGI.identifier              location_subacon
20    AT1G11360.4                       plastid
21    AT1G11650.2                       nucleus
22    AT1G11930.2                       cytosol
23    AT1G12010.1                    peroxisome
24    AT1G12080.2                       nucleus
25    AT1G12140.1               plasma membrane
26    AT1G12250.2               cytosol,nucleus ## row which I want to delete
27    AT1G12520.2                    peroxisome
28    AT1G13320.2                       cytosol
29    AT1G13930.3                       nucleus
30    AT1G14250.1 extracellular,plasma membrane ## row which I want to delete
31    AT1G15340.2                       nucleus
32    AT1G15470.1                       cytosol
33    AT1G16460.4                       cytosol
34    AT1G16820.2         cytosol,mitochondrion ## row which I want to delete
35    AT1G17150.1                 extracellular
36    AT1G17330.1                       cytosol
37    AT1G17470.2                       cytosol
38    AT1G17890.3                       cytosol
39    AT1G19730.1                       cytosol
40    AT1G20060.1                       nucleus

正如我在示例中所示,我只想删除那些具有两个由逗号分隔的本地化的行。

1 个答案:

答案 0 :(得分:3)

您可以使用grepl

tbl_EOD <- tbl_EOD[!grepl(",", tbl_EOD$location_subacon), ]

说明:grepl搜索字符向量,将其称为S,以获取模式。如果TRUE的对应元素包含模式,则返回与S相同长度的向量,否则返回FALSE。在这种情况下,模式为","。你真正想要的是那些没有逗号的行,所以你可以使用“!”在grepl前面,将TRUE的所有值转换为FALSE,反之亦然。


如果您要保留所有行,但删除逗号后的所有内容,则可以使用gsub

tbl_EOD$location_subacon <- gsub("(.*),.*", "\\1", tbl_EOD$location_subacon)

说明:gsub在字符向量S中搜索模式,并用替换替换该模式的每次出现。在这种情况下,模式为"(.*),.*",替换为"\\1"。该模式是一个正则表达式,类似于"(zero or more characters) followed by a comma followed by zero or more characters"。这里,括号捕获封闭的部分,以便您以后可以参考它。在这种情况下,替换只是捕获的部分,它由\\1表示。