我正在使用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”或“te”结尾的单词都应从data.frame中删除。
我知道如何使用逻辑运算符从data.frames中选择性地删除条目,但这些条目在您设置数字条件时起作用。我想这样做我需要使用正则表达式,但遗憾的是R是我“知道”的唯一编程语言,所以我不知道在这里使用什么类型的代码。
感谢您的帮助。 提前致谢。
答案 0 :(得分:23)
方法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
要避免使用正则表达式方法,您可以使用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"))
答案 1 :(得分: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
答案 2 :(得分:1)
使用grep
grep -xvE '.{17}(de|te).*' file.txt