r - R:具有标记化和 %like% 的自创函数仅适用于第一个标记
问题描述
我有一个两列的数据框,第二列(单元)主要包含第一列(str)的第一个单词。请查看以下内容:
> df <- data.frame(str = c("cups vegetable soup", "cup brown lentils", "carrot", "stalks celery"), unit = c("cups", "cup", NA, "stalks"), stringsAsFactors = FALSE)
> df
str unit
1 cups vegetable soup cups
2 cup brown lentils cup
3 carrot <NA>
4 stalks celery stalks
如果 $str 的第一个单词与 $unit 处的相应值(在同一行上)匹配,我想删除它。
对于该范围,我创建了如下所示的函数“DelFunction”:
DelFunction <- function(x, y) {
tokens_x <- x[[1]]
tokens_y <- y[[1]]
if ((tokens_x %like% tokens_y) == TRUE) {
regmatches(tokens_x, regexpr("[a-z]+", tokens_x)) <- ""
}
tokens_x
}
在此之后,我在相应的行上使用了 sapply
df$str<- sapply(df$str, DelFunction, df$unit)
如您所见,我得到以下结果,该代码仅适用于第一行,其中删除了“cups”一词。
> df
str unit
1 vegetable soup cups
2 cup brown lentils cup
3 carrot <NA>
4 stalks celery stalks
目标是得到以下结果
> df
str unit
1 vegetable soup cups
2 brown lentils cup
3 carrot <NA>
4 celery stalks
有人知道如何解决这个问题吗?
谢谢!
解决方案
可能的答案:
library(stringr)
library(dplyr, warn.conflicts = FALSE)
df <-
data.frame(
str = c(
"cups vegetable soup",
"cup brown lentils",
"carrot",
"stalks celery"
),
unit = c("cups", "cup", NA, "stalks"),
stringsAsFactors = FALSE
)
df %>%
mutate(str = trimws(str_replace(str, unit, ''))) %>%
mutate(str = if_else(is.na(unit), df$str, str)) -> df2
df2
#> str unit
#> 1 vegetable soup cups
#> 2 brown lentils cup
#> 3 carrot <NA>
#> 4 celery stalks
在不改变(很多)原始代码的情况下另一个可能的答案:
library(DescTools)
df <-
data.frame(
str = c(
"cups vegetable soup",
"cup brown lentils",
"carrot",
"stalks celery"
),
unit = c("cups", "cup", NA, "stalks"),
stringsAsFactors = FALSE
)
DelFunction <- function(x, y) {
tokens_x <- x
tokens_y <- paste0(y, "%")
if ((tokens_x %like% tokens_y) == TRUE) {
regmatches(tokens_x, regexpr("[a-z]+", tokens_x)) <- ""
}
trimws(tokens_x)
}
df$str <- sapply(df$str, DelFunction, df$unit)
df
#> str unit
#> 1 vegetable soup cups
#> 2 brown lentils cup
#> 3 carrot <NA>
#> 4 celery stalks
推荐阅读
- python - 如何拆分文本文件中的文本块并将其保存到对象或列表中?
- javascript - 用于闭环的javascript
- android - 如何使 EditText 可以处理 14 KB 文本 (Kotlin)
- php - laravel voyager 只是保持加载并且不起作用
- c# - ItextSharp 不使用 c# 维护 pdf 中的列宽
- ruby-on-rails - 在其他控制器中使用设计时没有响应
- amazon-web-services - Python 代码在 AWS EC2 G4 实例上自动终止
- javascript - 从另一个函数括号传递变量
- php - 如何加入“IN”结果并检查“where” active = 1?
- api - CodeIgniter,在 $this- 响应之后调用另一个函数