12

私は R を使用しており、次のような 2,000 近くのエントリを持つ data.frame があります。

> head(PVs,15)
     LogFreq   Word PhonCV  FreqDev
1593     140    was    CVC 5.480774
482      139    had    CVC 5.438114
1681     138    zou   CVVC 5.395454
1662     137    zei    CVV 5.352794
1619     136   werd   CVCC 5.310134
1592     135  waren CVV-CV 5.267474
620      134    kon    CVC 5.224814
646      133   kwam   CCVC 5.182154
483      132 hadden CVC-CV 5.139494
436      131   ging    CVC 5.096834
734      130  moest  CVVCC 5.054174
1171     129  stond  CCVCC 5.011514
1654     128    zag    CVC 4.968854
1620     127 werden CVC-CV 4.926194
1683     126 zouden CVV-CV 4.883534

私がやりたいことは、「Word」列のメンバーとして「te」または「de」で終わらない文字列を持つすべてのエントリを除いて、PV に等しい新しい data.frame を作成することです。削除されました。つまり、「de」または「te」で終わらないすべての単語は、data.frame から削除する必要があります。

論理演算子を使用して data.frames からエントリを選択的に削除する方法は知っていますが、それらは数値基準を設定しているときに機能します。これを行うには正規表現を使用する必要があると思いますが、悲しいことに、私が「知っている」プログラミング言語は R だけなので、ここで使用するコードの種類を知ることはできません。

私はあなたの助けに感謝します。前もって感謝します。

4

3 に答える 3

24

方法 1

grepl適切な正規表現で使用できます。次の点を考慮してください。

x <- c("blank","wade","waste","rubbish","dedekind","bated")
grepl("^.+(de|te)$",x)
[1] FALSE  TRUE  TRUE FALSE FALSE FALSE

正規表現は^、任意の回数 ( ) で開始 ( ) し.+、次に de または te ( (de|te)) のいずれかを見つけてから終了 ( $) することを示します。

だからあなたのdata.frameの試してみてください、

subset(PVs,grepl("^.+(de|te)$",Word))

方法 2

regexp メソッドを回避するには、substr代わりにメソッドを使用できます。

# substr the last two characters and test
substr(x,nchar(x)-1,nchar(x)) %in% c("de","te")
[1] FALSE  TRUE  TRUE FALSE FALSE FALSE

だから試してみてください:

subset(PVs,substr(Word,nchar(Word)-1,nchar(Word)) %in% c("de","te"))
于 2012-10-22T13:24:19.207 に答える
3

データを少し修正して、「て」または「で」で終わる単語が含まれるようにしました。

> PV
     LogFreq   Word PhonCV  FreqDev
1593     140 blahte    CVC 5.480774
482      139    had    CVC 5.438114
1681     138 aaaade   CVVC 5.395454
1662     137    zei    CVV 5.352794
1619     136   werd   CVCC 5.310134
1592     135  waren CVV-CV 5.267474
620      134    kon    CVC 5.224814
646      133 kwamde   CCVC 5.182154
483      132 hadden CVC-CV 5.139494
436      131   ging    CVC 5.096834
734      130 moeste  CVVCC 5.054174
1171     129  stond  CCVCC 5.011514
1654     128  zagde    CVC 4.968854
1620     127 werden CVC-CV 4.926194
1683     126 zouden CVV-CV 4.883534

# Add a column to PV that you can visually check the regular expression matches.
PV$Match <- grepl(pattern = "(de|te)$", PV$Word)

# Subset PV data frame to show only TRUE matches
PV <- PV[PV$Match == FALSE, ]

結果を以下に示します

     LogFreq   Word PhonCV  FreqDev Match
482      139    had    CVC 5.438114 FALSE
1662     137    zei    CVV 5.352794 FALSE
1619     136   werd   CVCC 5.310134 FALSE
1592     135  waren CVV-CV 5.267474 FALSE
620      134    kon    CVC 5.224814 FALSE
483      132 hadden CVC-CV 5.139494 FALSE
436      131   ging    CVC 5.096834 FALSE
1171     129  stond  CCVCC 5.011514 FALSE
1620     127 werden CVC-CV 4.926194 FALSE
1683     126 zouden CVV-CV 4.883534 FALSE
于 2012-10-22T15:32:00.057 に答える
1

grep の使用

grep -xvE '.{17}(de|te).*' file.txt
于 2012-10-22T13:35:46.280 に答える