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

我想要做的是创建一个等于 PVs 的新 data.frame,除了所有条目都具有作为“Word”列的成员的字符串不以“te”或“de”结尾删除。即所有不以“de”或“te”结尾的单词都应该从data.frame中删除。

我知道如何使用逻辑运算符从 data.frames 中选择性地删除条目,但是当您设置数字标准时,它们会起作用。我认为要做到这一点,我需要使用正则表达式,但遗憾的是 R 是我“知道”的唯一编程语言,所以我远不知道在这里使用什么类型的代码。

我感谢您的帮助。提前致谢。

4

3 回答 3

24

方法一

您可以使用grepl适当的正则表达式。考虑以下:

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

正则表达式^用任意次数 () 表示 begin () .+,然后找到 de 或 te (),然后找到(de|te)end ( $)。

因此,对于您的 data.frame 尝试,

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

方法二

要避免使用 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

我稍微修改了数据,以便有以 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
于 2012-10-22T15:32:00.057 回答
1

使用 grep

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