如何将我的for循环放在dplyr :: mutate()中? [tidyverse]

时间:2018-02-07 18:20:50

标签: r dplyr

我有一个for-loop可以纠正字符串中的拼写错误(实际上它会将拼写错误的字符串更改为相同)。

由于我通常使用dplyr的函数并且具有许多更改的长代码序列,因此我希望以dplyr友好的方式在for-loop中使用mutate {1}}致电。

这是一个例子。

name <-  c('pat','paet','Pat', 'bob',
     'beb','bab')
name
[1] "pat"  "paet" "Pat"  "bob"  "beb"  "bab"

for ( i in seq_along(name)){

  name <- ifelse(agrepl(name[[i]],name),name[[i]],name)

}

name
 [1] "pat" "pat" "pat" "bob" "bob" "bob"

使用dplyr / data_frame方法时,我想获得上述结果。

df <- data_frame(name_ii =  c('pat',
         'paet',
         'Pat',
         'bob',
         'beb',
         'bab'))
df %>% 
mutate(name = name_ii,
       name = for ( i in seq_along(name)){

  name <- ifelse(agrepl(name[[i]],name),name[[i]],name)

}
)

Error in mutate_impl(.data, dots) : Binding not found: name_ii.

我试图将它放入一个名为identicator的用户定义函数中。

identicator <- function(x){
name <- x

for ( i in seq_along(name)){

      name <- ifelse(agrepl(name[[i]],name),name[[i]],name)

    }
}

  df %>% 
    mutate(new.name = identicator(x))

Error in mutate_impl(.data, dots) : 
  Column `d` is of unsupported type NULL

由于

1 个答案:

答案 0 :(得分:1)

identicator的一个问题是,在for循环内分配后,不会返回“名称”

identicator <- function(x){
 name <- x

 for ( i in seq_along(name)){

     name <- ifelse(agrepl(name[[i]],name),name[[i]],name)

     }
   name  ###
 }

,第二个问题是函数参数是'name_ii'列

df %>% 
   mutate(new.name = identicator(name_ii))
# A tibble: 6 x 2
#  name_ii new.name
#  <chr>   <chr>   
#1 pat     pat     
#2 paet    pat     
#3 Pat     pat     
#4 bob     bob     
#5 beb     bob     
#6 bab     bob