簡體   English   中英

從data.frame中選擇以R中的特定字符串結尾的行

[英]Select rows from data.frame ending with a specific character string in R

我正在使用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

我想要做的是創建一個等於PV的新data.frame,除了作為“Word”列成員的所有條目都是一個不以“te”或“de”結尾的字符串除去。 即所有不以“de”或“te”結尾的單詞都應從data.frame中刪除。

我知道如何使用邏輯運算符從data.frames中選擇性地刪除條目,但這些條目在您設置數字條件時起作用。 我想這樣做我需要使用正則表達式,但遺憾的是R是我“知道”的唯一編程語言,所以我不知道在這里使用什么類型的代碼。

我感謝您的幫助。 提前致謝。

方法1

您可以將greplgrepl的正則表達式一起使用。 考慮以下:

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"))

我稍微修改了數據,以便在te或de中結束單詞。

> 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

使用grep

grep -xvE '.{17}(de|te).*' file.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM