grep
(和grepl
)不適合此:你是不是濾波基於文本內容。您正在(a)基於Faults
進行過濾,和(b)更改Class
中的文本。
您的數據:上Faults
ds1 <- structure(list(Class = c("org.apache.tools.ant.taskdefs.Definer", "org.apache.tools.ant.taskdefs.Definer", "org.apache.tools.ant.taskdefs.Delete", "org.apache.tools.ant.taskdefs.Deltree", "org.apache.tools.ant.taskdefs.DependSet", "org.apache.tools.ant.taskdefs.DependSet", "org.apache.tools.ant.taskdefs.DependSet", "org.apache.tools.ant.taskdefs.Ear", "org.apache.tools.ant.taskdefs.Ear", "org.apache.tools.ant.taskdefs.Echo", "org.apache.tools.ant.Exec", "org.apache.tools.ant.Exec"),
Faults = c(2L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L)),
.Names = c("Class", "Faults"), class = "data.frame", row.names = c(NA, -12L))
過濾(你已經有這個)。你只需要這兩個命令中的一個,它們都做同樣的事情;主要區別在於可讀性(個人偏好)和性能(第二個,在這種情況下,花費大約35%的時間,但因爲它們都以微秒爲單位進行測量,所以競爭似乎很愚蠢)。
ds2 <- subset(ds1, Faults == 2)
ds2 <- ds1[ds1$Faults == 2,]
更新Class
刪除最後一個字(和點):
ds2$Class <- gsub("\\.[^.]*$", "", ds2$Class)
ds2
# Class Faults
# 1 org.apache.tools.ant.taskdefs 2
# 2 org.apache.tools.ant.taskdefs 2
# 4 org.apache.tools.ant.taskdefs 2
# 5 org.apache.tools.ant.taskdefs 2
# 6 org.apache.tools.ant.taskdefs 2
# 7 org.apache.tools.ant.taskdefs 2
# 8 org.apache.tools.ant.taskdefs 2
# 9 org.apache.tools.ant.taskdefs 2
# 11 org.apache.tools.ant 2
# 12 org.apache.tools.ant 2
注:這也可以用sub
代替gsub
完成,但後者是我的,因爲大多數的第一個到達的我用處理更大和重複的正則表達式。兩者之間的主要(?只)的區別在於:
'sub' and 'gsub' perform replacement of the first and all matches respectively
(從?sub
)。
我知道沒有工具,都過濾和更改在一個單一的命令(雖然也許data.table
呢,我不知道)。
類似@ egnha的解決方案(使用magrittr
),下面是一個使用dplyr
,許多人聲稱是非常容易閱讀和適應(以性能爲潛在成本):
library(dplyr)
ds2 <- ds1 %>%
filter(Faults == 2) %>%
mutate(Class = gsub("\\.[^.]*$", "", Class))
因爲我提到性能,這裏是一個比較:
microbenchmark(indexing = { ds2 <- ds1[ds1$Faults == 2,]; ds2$Class <- gsub("\\.[^.]*$", "", ds2$Class) },
subset = { ds2 <- subset(ds1, Faults == 2) ; ds2$Class <- gsub("\\.[^.]*$", "", ds2$Class) },
dplyr = { ds1 %>% filter(Faults == 2) %>% mutate(Class = gsub("\\.[^.]*$", "", Class)) })
# Unit: microseconds
# expr min lq mean median uq max neval
# indexing 71.841 87.7045 109.4496 104.2975 120.7075 269.493 100
# subset 102.473 115.6020 147.0108 139.1230 165.5620 287.726 100
# dplyr 1067.030 1156.3745 1323.1174 1225.4805 1351.2920 4270.308 100
爲了記錄在案,dplyr
使用這種方式是不是經常這樣的速度,在差與其他方法相比。它通常不是更快,但它往往不是一個數量級的慢。
'grepl'會更合適嗎? – r2evans
你可以使用'grepl'解決它嗎? –
''/^([^\\.]+)/「'有一個嚴重問題:你使用的正則表達式分隔符'/'不應該在R表達式函數中使用。此外,當您在字符類中轉義'.'時,您將它設爲僅兼容PCRE的表達式(不再與TRE兼容)。但是,要在最後一個點之前獲得字符串,您需要使用'「^(。*)\\。」'(然後您在組1中有一個捕獲值)或PCRE''^。*(?= \ \「)」'(用'perl = TRUE')。 –