dplyr情况下:仅第一个实例受到影响

时间:2019-03-11 06:40:30

标签: r dplyr mutate

我有一个数据框,我想在其中更改一些列中的值。

列值如下:

  

[1]“软珊瑚”“软珊瑚”“软珊瑚”“软珊瑚”“软珊瑚”“软珊瑚”“软珊瑚”     [8]“软珊瑚”“软珊瑚”“ ..5”“ ..5”“ ..5”“ ..5”“ ..5”
   [15]“ ..5”“ ..5”“ ..5”“ ..5”“ ..6”“ ..6”“ ..6”
   [22]“ ..6”“ ..6”“ ..6”“ ..6”“ ..6”“ ..6”“ ..7”
   [29]“ ..7”“ ..7”“ ..7”“ ..7”“ ..7”“ ..7”“ ..7”
   [36]“ ..7”“ ..8”“ ..8”“ ..8”“ ..8”“ ..8”“ ..8”
   [43]“ ..8”“ ..8”“ ..8”“ ..9”“ ..9”“ ..9”“ ..9”
   [50]“ ..9”“ ..9”“ ..9”“ ..9”“ ..9”“ ..10”“ ..10”
   [57]“ ..10”“ ..10”“ ..10”“ ..10”“ ..10”“ ..10”“ ..10”
   [64]“ ..11”“ ..11”“ ..11”“ ..11”“ ..11”“ ..11”“ ..11”
   [71]“ ..11”“ ..11”“海迷”“海迷”“海迷”“海迷”“海迷”
   [78]“海迷”“海迷”“海迷”“海迷”“ ..13”“ ..13”“ ..13”
   [85]“ ..13”“ ..13”“ ..13”“ ..13”“ ..13”“ ..13”“ ..14”
   [92]“ ..14”“ ..14”“ ..14”“ ..14”“ ..14”“ ..14”“ ..14”
   [99]“ ..14”

我想根据位置替换数字,例如“软珊瑚”或“海扇”

我的代码如下所示(啊是数据帧obj,cor_type是列名):

ah <- ah %>% mutate(cor_n = case_when(stringi::stri_detect(str = cor_type, regex = "\\.") ~lag(cor_type),
                                     TRUE ~ cor_type
            )
          )

但是,这仅会更改正则表达式匹配的第一个实例,即第9行。其余值保持不变。 我猜想我对mutate的工作方式有误? PS:我不想写一个for循环

1 个答案:

答案 0 :(得分:3)

我不认为case_when是这里的最佳选择。一种方法是将replace个具有模式(\\.)的值转换为NA,然后将fill NA s个具有先前的非NA值。

library(tidyverse)

ah %>%
  mutate(cor_type = replace(cor_type, str_detect(cor_type, "\\."), NA)) %>%
  fill(cor_type)

#    a    cor_type
#1   1 soft corals
#2   2 soft corals
#3   3 soft corals
#4   4 soft corals
#5   5 soft corals
#6   6 soft corals
#7   7    sea fans
#8   8    sea fans
#9   9    sea fans
#10 10    sea fans

数据

创建了一个可复制的小示例进行处理。

ah <- data.frame(a = 1:10, cor_type = c("soft corals", "soft corals",
      "..5", "..5", "..5","..6", "sea fans", "sea fans", "..13", "..14" ))

ah
#    a    cor_type
#1   1 soft corals
#2   2 soft corals
#3   3         ..5
#4   4         ..5
#5   5         ..5
#6   6         ..6
#7   7    sea fans
#8   8    sea fans
#9   9        ..13
#10 10        ..14