根据其他列中的匹配有条件地替换单元格

问题描述 投票:0回答:1

考虑以下简化数据框:

df<-data.frame(x1=c("A","B","C"),x2=c("K to B","K to B","K to B"))

我想在 x2 中找不到 x1 字符的行中将 x2 中的字符串替换为 NA(或“”)。即数据框应修正为:

df_corrected<-data.frame(x1=c("A","B","C"),x2=c("NA","K to B","NA"))

实际数据集包含 95000 行和 x2 中的许多不同表达式。我还使用 Tidyverse 来清理数据。我曾尝试使用 grepl() 来搜索 x2 字符串中的 x1 值,但是我在为每一行迭代执行此操作时遇到问题(需要函数/前向循环?)并将其与 mutate() 组合。如果更好的话,我也愿意接受其他选择(例如 sapply 和 base R?或 sqldf?)

提前非常感谢!

r tidyverse grepl mutate
1个回答
0
投票

您可以使用

grepl
来检查 x2 是否包含 x1
rowwise
的字符串,如下所示:

library(dplyr)
df %>%
  rowwise() %>%
  mutate(x2 = case_when(grepl(x1, x2) ~ x2,
                        TRUE ~ "NA"))
#> # A tibble: 3 × 2
#> # Rowwise: 
#>   x1    x2    
#>   <chr> <chr> 
#> 1 A     NA    
#> 2 B     K to B
#> 3 C     NA

创建于 2023-08-30,使用 reprex v2.0.2

© www.soinside.com 2019 - 2024. All rights reserved.