我很难理解为什么我下面的代码只有在结合使用rowwise
和ifelse
时才能工作.或者更准确地说,我想我明白了为什么它在那个场景中工作,但不明白为什么它不能简单地与if_else
一起工作.
我要做的是,我要判断某一行是否包含单词"infle"或"outfile",以及它是否有相对路径("…").如果它有单词"infle/outfile"而不是相对路径,那么它有一个绝对路径"C:".在这种情况下,我想用其他名称替换用户名(这里是:"test").
有什么 idea 吗?
数据:
df <- structure(list(value = c("infile 'C:\\Users\\USER\\folder\\Data.sav'",
"infile '..\\folder\\Data.sav'", "outfile '..\\folder\\Data.sav'",
"test", "")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-5L))
user_name <- "test"
有效的代码:
df |>
rowwise() |>
mutate(value = ifelse(str_detect(value, "infile|outfile") & !str_detect(value, "\\'\\.\\.\\\\"),
str_replace(value,
str_sub(value,
str_locate_all(value, "\\\\")[[1]][2] + 1,
str_locate_all(value, "\\\\")[[1]][3] - 1),
user_name),
value)) |>
ungroup()
带输出:
# A tibble: 5 × 1
value
<chr>
1 "infile 'C:\\Users\\test\\folder\\Data.sav'"
2 "infile '..\\folder\\Data.sav'"
3 "outfile '..\\folder\\Data.sav'"
4 "test"
5 ""
不起作用的代码:
df |>
mutate(value = if_else(str_detect(value, "infile|outfile") & !str_detect(value, "\\'\\.\\.\\\\"),
str_replace(value,
str_sub(value,
str_locate_all(value, "\\\\")[[1]][2] + 1,
str_locate_all(value, "\\\\")[[1]][3] - 1),
user_name),
value))
我认为这是可行的,但也给出了一个警告:
Warning messages:
1: Problem while computing `value = if_else(...)`.
ℹ empty search patterns are not supported
2: Problem while computing `value = if_else(...)`.
ℹ empty search patterns are not supported
不起作用的代码:
df |>
rowwise() |>
mutate(value = if_else(str_detect(value, "infile|outfile") & !str_detect(value, "\\'\\.\\.\\\\"),
str_replace(value,
str_sub(value,
str_locate_all(value, "\\\\")[[1]][2] + 1,
str_locate_all(value, "\\\\")[[1]][3] - 1),
user_name),
value)) |>
ungroup()
Error in `mutate()`:
! Problem while computing `value = if_else(...)`.
ℹ The error occurred in row 2.
Caused by error:
! Empty `pattern` not supported