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))
フィルター(あなたはすでにこれを持っていました)。これらの2つのコマンドのうちの1つだけが必要です。両方とも同じことを行います。主な違いは読みやすさ(個人的な好み)とパフォーマンスです(2番目のものは、この場合、約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
注:これはまた、代わりにgsub
のsub
で行うことができますが、後者は、私の最も以来初めて、リーチ私の使用は、大規模で繰り返しの正規表現を扱う。 (?sub
から)
'sub' and 'gsub' perform replacement of the first and all matches respectively
:2の間の主要な(?のみ)の違いは、ということです。
両方ともフィルタリングと1つのコマンドでの変更(おそらくdata.table
はありますがわかりません)。(それがmagrittr
を使用しています)、ここで読むと、(パフォーマンスの潜在的なコストで)適応するために、多くの人々は非常に簡単です主張dplyr
を使用して、一つだ@のegnhaのソリューションと同様に
:
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'を使って解決できますか? –
'' /^([^\\.]+)/ ''には深刻な問題が1つあります:R正規表現関数では使用しない正規表現の区切り文字 '/'を使用しています。さらに、文字クラスで '.'をエスケープすると、PCREのみの互換表現になります(もはやTRE互換ではありません)。しかし、最後のドットの前の文字列を取得するには、 '' ^(*)\\。 "'(PC1) \。) "'( 'perl = TRUE'で)。 –