Выберите строки из data.frame, заканчивающиеся на определенную строку символов в R
Я использую R, и у меня есть data.frame с почти 2000 записей, которые выглядят следующим образом:
> 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
Я хочу создать новый data.frame, равный PV, за исключением того, что все записи, имеющие в качестве члена столбца "Word" строку символов, которая не заканчивается ни "te", ни "de" удален. то есть все слова, не заканчивающиеся на "de" или "te", должны быть удалены из файла data.frame.
Я знаю, как избирательно удалять записи из data.frames с помощью логических операторов, но они работают, когда вы устанавливаете числовые критерии. Я думаю, что для этого мне нужно использовать регулярные выражения, но, к сожалению, R - единственный язык программирования, который я "знаю", поэтому я далеко не знаю, какой тип кода использовать здесь.
Я ценю вашу помощь.
Заранее спасибо.
Ответы
Ответ 1
Метод 1
Вы можете использовать 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))
Метод 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"))
Ответ 2
Я немного изменил данные, чтобы были слова, которые закончились в 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
Ответ 3
Использование grep
grep -xvE '.{17}(de|te).*' file.txt