gpt4 book ai didi

r - 如何正确地从外部列表循环以在 dplyr 中使用内部 mutate

转载 作者:行者123 更新时间:2023-12-02 02:41:45 25 4
gpt4 key购买 nike

我正在尝试修复循环函数的一部分

我创建了包含字符串和正则表达式的长列表(例如“ee”)。结构如下

ee <- c("retard+$", "aluminium\d+", "potassium+$", "ID+$",.......,"chloride+$",)

注意:我故意把正则表达式放在那里

我想获取此列表中的每个元素并在相当大的数据框中替换为“BB00”(下面是一小部分,有用的列是“c”)

dput(df)
structure(list(a = c(1, 2, 3, 4, 6, 7, 8), b = c(2011, 2012, 2010, 1995, 1998, 2011, 2011), c = c("enemy ID9", "John potassium", "chloride misch", "malchloride", "retardfalling", "friendretard", "use to beID10")), row.names = c(NA, -7L), class = "data.frame")

所以我尝试创建一个函数,它接受一个列表,并通过将每个元素传递给 dplyr 的 mutate() 中的 gsub() 进行循环,如下所示

library(tibble)
library(dplyr) library(tidytext) library(tidyr)


strpDetach<- function(x){
for(j in x){
df1=df %>% mutate(c = gsub(j, "BB00", c,ignore.case=TRUE))
return(df1) }
}

df2=strpDetach(ee)

dput(df2)
structure(list(a = c(1, 2, 3, 4, 6, 7, 8), b = c(2011, 2012, 2010, 1995, 1998, 2011, 2011), c = c("enemy ID9", "John potassium", "chloride misch", "malchloride", "retardfalling", "friendBB00", "use to beID10")), row.names = c(NA, -7L), class = "data.frame")

显然,只有列表中的第一个元素有效

以另一种方式修改函数(直接获取列表的每个元素)如下:

strpDetach<- function(j){df %>% mutate(c = gsub(j, "BB00", c,ignore.case=TRUE))}
for( j in ee){
for (i in 1:ncol(df)) {
c=df[,3]
df1=strpDetach(j)
}
}

dput(df1)
structure(list(a = c(1, 2, 3, 4, 6, 7, 8), b = c(2011, 2012, 2010, 1995, 1998, 2011, 2011), c = c("enemy ID9", "John potassium", "chloride misch", "malBB000", "retardfalling", "friendretard", "use to beID10")), row.names = c(NA, -7L), class = "data.frame")

只有列表中的最后一个元素有效

我的问题是我在循环中哪里做错了什么?

非常感谢您阅读我的长文!!

预期的输出是:

dput(df1)
structure(list(a = c(1, 2, 3, 4, 6, 7, 8), b = c(2011, 2012, 2010, 1995, 1998, 2011, 2011), c = c("enemy BB000", "JohnBB000", "chloride misch", "malBB000", "retardfalling", "friendBB000", "use to beBB000")), row.names = c(NA, -7L), class = "data.frame")

最佳答案

这里,我们只需要一个循环而不是嵌套循环,因为 sub 中的 x 是矢量化的

ee <- c('ID\\d+$', 'potassium$', 'chloride$', 'retard$')
for(pat in ee) df$c <- sub(pat, "BB000", df$c)

由于替换在每个元素中发生一次,即在字符串的末尾 ($),我们只需要 sub (gsub - 全局替换)。与此同时,更改的列在每个循环中更新,以便在每次运行时更新


此外,由于问题是关于dplyr,我们可以在每个for 循环中更新数据集

library(dplyr)
for(pat in ee) {

df <- df %>%
mutate(c = str_replace(c, pat, "BB000"))
}

关于r - 如何正确地从外部列表循环以在 dplyr 中使用内部 mutate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59039001/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com