我有一个数据框,我想在其中更改一些列中的值。
列值如下:
[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循环
答案 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