【发布时间】:2021-06-07 16:42:42
【问题描述】:
我正在努力摆脱:
- 空格和/或第一个单词和之后的单词;
- 想去掉第一个单词后的括号
- 或者只保留列中的第一个单词
这是我拥有的数据集类型:
structure(list(med_name = c("Co-amoxiclav", "doxycycline", "Gentamicin",
"Co-trimoxazole", "Sodium Chloride 0.9% infusion (ANES) 20 mL + Vancomycin",
"Piperacillin + Tazobactam (contains penicillin)"), new1 = c("Co-amoxiclav",
"doxycycline", "Gentamicin", "Co-trimoxazole", "Sodium Chloride",
"Piperacillin + Tazobactam (contains penicillin)"), new2 = c(NA,
NA, NA, NA, "Vancomycin", "Tazobactam (contains penicillin)")), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
使用下面的代码,我相信我摆脱了空格之后的第一个单词和括号中的单词。实际上只想在new_1和new_2每一列中保留第一个单词
dt_test_1 <- dt_test %>%
dplyr::mutate(keep_first_letter_new_1 = gsub(' [A-z ]*', "", new1),
keep_first_letter_new_2 = gsub(' [A-z]*', "", new2),
remove_brackets_new_1 = gsub("( )", "", keep_first_letter_new_1),
remove_brackets_new_2 = gsub("( )", "", keep_first_letter_new_2)
)
但正如在 dt_test_1 中观察到的 - 我没有得到我想要的输出。检查最后两列以及每列中的最后一行。这是我得到的:
structure(list(med_name = c("Co-amoxiclav", "doxycycline", "Gentamicin",
"Co-trimoxazole", "Sodium Chloride 0.9% infusion (ANES) 20 mL + Vancomycin",
"Piperacillin + Tazobactam (contains penicillin)"), new1 = c("Co-amoxiclav",
"doxycycline", "Gentamicin", "Co-trimoxazole", "Sodium Chloride",
"Piperacillin + Tazobactam (contains penicillin)"), new2 = c(NA,
NA, NA, NA, "Vancomycin", "Tazobactam (contains penicillin)"),
keep_first_letter_new_1 = c("Co-amoxiclav", "doxycycline",
"Gentamicin", "Co-trimoxazole", "Sodium", "Piperacillin+(contains)"
), keep_first_letter_new_2 = c(NA, NA, NA, NA, "Vancomycin",
"Tazobactam(contains)"), remove_brackets_new_1 = c("Co-amoxiclav",
"doxycycline", "Gentamicin", "Co-trimoxazole", "Sodium",
"Piperacillin+(contains)"), remove_brackets_new_2 = c(NA,
NA, NA, NA, "Vancomycin", "Tazobactam(contains)")), row.names = c(NA,
-6L), class = c("tbl_df", "tbl", "data.frame"))
因此,我的问题是,为什么我没有得到我想要的输出?
这是我想要的输出:
structure(list(med_name = c("Co-amoxiclav", "doxycycline", "Gentamicin",
"Co-trimoxazole", "Sodium Chloride 0.9% infusion (ANES) 20 mL + Vancomycin",
"Piperacillin + Tazobactam (contains penicillin)"), new1 = c("Co-amoxiclav",
"doxycycline", "Gentamicin", "Co-trimoxazole", "Sodium Chloride",
"Piperacillin + Tazobactam (contains penicillin)"), new2 = c(NA,
NA, NA, NA, "Vancomycin", "Tazobactam (contains penicillin)"),
keep_first_letter_new_1 = c("Co-amoxiclav", "doxycycline",
"Gentamicin", "Co-trimoxazole", "Sodium", "Piperacillin+(contains)"
), keep_first_letter_new_2 = c(NA, NA, NA, NA, "Vancomycin",
"Tazobactam(contains)"), remove_brackets_new_1 = c("Co-amoxiclav",
"doxycycline", "Gentamicin", "Co-trimoxazole", "Sodium",
"Piperacillin"), remove_brackets_new_2 = c(NA, NA, NA, NA,
"Vancomycin", "Tazobactam")), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
最后两列是我需要的最后一列。
【问题讨论】:
-
您应该精确问题以获得直接的答案。您的正则表达式通常处于关闭状态:1)
gsub(' [A-z ]*', "", new1)删除所有空格序列,然后删除零个或多个空格、ASCII 字母以及[\`]^_字符,以及 2)gsub("( )", "", keep_first_letter_new_1)删除所有空格。 -
@WiktorStribiżew - 我是自然语言处理的新手,很难具体说明
-
你是否意识到你所有的前 3 点都是关于只保留第一个单词?从这些要求来看,
sub(" .*", "", x)就是您所需要的。 -
在发布之前请考虑真正的需求。
-
@WiktorStribiżew 然而,这是不同情况下的问题。我已经提供了问题,我已经提供了我正在使用的代码,我还提供了输出,然后是所需的答案。我确实相信你应该为新手学习留下一个杠杆,最好的学习方法是不要让他们感到困惑:)。只要继续我给出的假数据集,看看我有多清楚,不管未使用的概念如何(我还是正则表达式的新手)。但如果证明你没有去检查。坐在一边,判断创建这篇文章背后的辛勤工作不是它应该工作的方式。