【问题标题】:Stringr str_replace(), for loop and functional programming failureStringr str_replace(),for循环和函数式编程失败
【发布时间】:2018-08-29 04:24:38
【问题描述】:

如果您有任何关于创建“循环”或“函数”的建议,我将不胜感激: 我的目标本质上是手动提取文本字符串 - 将几个相关术语修改为一个术语。

我的代码单独执行它绝对可以正常工作,但如果我可以迭代它会节省我很多时间。

# dataframe of the collection of terms to be substituted into one term
Babanov_stem <- c("бабановдун", "бабановду", "бабановтун", "бабанову",  "бабановту", "бабановго", "бабановко", "бабановым", "бабановдон", "бабановтон",
           "бабанове", "бабановто", "babanova", "babanov", "babanovpresident",
           "бабанова")

Babanov_seq <- seq(1:16)

Babanov <- data_frame(Babanov_seq, Babanov_stem)

# single code works fine
tidy_KG17pre$word2 <- str_replace_all(tidy_KG17pre$word2, Babanov$Babanov_stem[15], "бабанов")

单独的代码效果很好,但我真的很想迭代 - 因为我必须在大约 25 个术语但跨越 5 个候选者(Babanov 是候选者 1)中这样做

# My poor effort at a for loop
for (i in seq(Babanov$Babanov_stem)){
tidy_KG17pre$word2 <- str_replace_all(tidy_KG17pre$word, Babanov_stem[i], "бабанов")
}

# My effort at Functional Programming appears to be a bit weak too
library(purrr)
tidy_KG17pre$word2 <- tidy_KG17pre$word %>% 
map(str_replace_all, Babanov$Babanov_stem, "бабанов") %>% 
reduce(append)

如果您有任何关于如何使上述任何一项工作的想法,我将非常感激:)

【问题讨论】:

  • 请提供reproducible 示例
  • 非常感谢您回复 Val 和 Paul - 有没有办法发送数据帧(它是一个未嵌套的整齐格式数据帧)?
  • 阅读Val提供的链接,可以使用dput,如果太大,可以放到github gist上。
  • 非常感谢 Paul 和 Val,对不起,我是个新手 - 数据集在 github - rfche704/Kyrgyz-tidy-Dataset 还有 2 个数据集,字符串和 tidy 版本。我一直在编辑整理版

标签: r loops for-loop functional-programming stringr


【解决方案1】:

我创建了一个假数据集来玩。

dtf <- data_frame(word = paste(Babanov_stem, "blabla"))
head(dtf)
# # A tibble: 6 x 1
#                word
#               <chr>
# 1 бабановдун blabla
# 2  бабановду blabla
# 3 бабановтун blabla
# 4   бабанову blabla
# 5  бабановту blabla
# 6  бабановго blabla

按照您的建议替换单个代码

dtf$word <- str_replace_all(dtf$word, Babanov$Babanov_stem[15], "бабанов")

使用循环将 Babanov_stem 中的任何单词替换为单词“бабанов”

for (w in Babanov$Babanov_stem){
    dtf$word <- str_replace_all(dtf$word, w, "бабанов")
}
head(dtf)
# # A tibble: 6 x 1
#             word
#            <chr>
# 1 бабанов blabla
# 2 бабанов blabla
# 3 бабанов blabla
# 4 бабанов blabla
# 5 бабанов blabla
# 6 бабанов blabla

注意:for 循环中不需要 seq()

上面的循环使用了适当的修改。这可能是不建议使用函数式编程的情况。请参阅 Hadley wickham 关于高级 R 编程的书中的 Loops that should be left as is

【讨论】:

    【解决方案2】:

    感谢保罗的帮助。我终于弄明白了。 最好的方法是使用“stringr”来调整用于在文本挖掘中提取 URL 的常用函数。该命令采用带有“www”的字符串。在其中提取并用“空格”替换它

    我做了同样的事情,但不是“www”。我使用了候选人名字的词干。拉丁字母或西里尔字母都很好

    str_replace_all(KG17$message, "бабан[^[:blank:]]+", "babanov")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 1970-01-01
      • 2011-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多