R 如何基于列表删除多个列值

R 如何基于列表删除多个列值,r,gsub,R,Gsub,我有一个数据集df,如下所示: 如果我想移动列表中的任何值。我该怎么办 可使用以下代码构建df和RM: df<-structure(list(cy3.CSV = c("cy3.CSV", NA, NA), cy6.CSV = c("cy1.CSV", "cy24.CSV", "cy6.CSV"), dlt.CSV = c("dlt.CSV", NA, NA), dm.CSV = c(&q

我有一个数据集df,如下所示:

如果我想移动列表中的任何值。我该怎么办

可使用以下代码构建df和RM:

df<-structure(list(cy3.CSV = c("cy3.CSV", NA, NA), cy6.CSV = c("cy1.CSV", 
"cy24.CSV", "cy6.CSV"), dlt.CSV = c("dlt.CSV", NA, NA), dm.CSV = c("dm.CSV", 
NA, NA), dov.CSV = c("dov.CSV", "dov_1.CSV", NA), dov_1.CSV = c("dov_1.CSV", 
NA, NA), ds.CSV = c("ds.CSV", "ds_1.CSV", NA)), row.names = c(NA, 
-3L), class = c("tbl_df", "tbl", "data.frame"))

RM <-c("chem.CSV",  "dov_1.CSV", "eot_p.CSV", "dm.CSV', "vs.CSV")

df这是否有效:

data.frame(lapply(df, function(x) gsub(paste0(RM, collapse = '|'), NA, x)))
  cy3.CSV  cy6.CSV dlt.CSV dm.CSV dov.CSV dov_1.CSV   ds.CSV
1 cy3.CSV  cy1.CSV dlt.CSV   <NA> dov.CSV      <NA>   ds.CSV
2    <NA> cy24.CSV    <NA>   <NA>    <NA>      <NA> ds_1.CSV
3    <NA>  cy6.CSV    <NA>   <NA>    <NA>      <NA>     <NA>
data.frame(lappy(df,函数(x)gsub(paste0(RM,collapse='|'),NA,x)))
cy3.CSV cy6.CSV dlt.CSV dm.CSV dov.CSV dov_1.CSV ds.CSV
1 cy3.CSV cy1.CSV dlt.CSV dov.CSV ds.CSV
2 cy24.CSV ds_1.CSV
3.cy6.CSV
使用purrr和stringr包:

library(purrr)
library(stringr)
map_df(df, ~ str_replace_all(.x, str_c(RM, collapse = '|'), NA_character_))
# A tibble: 3 x 7
  cy3.CSV cy6.CSV  dlt.CSV dm.CSV dov.CSV dov_1.CSV ds.CSV  
  <chr>   <chr>    <chr>   <chr>  <chr>   <chr>     <chr>   
1 cy3.CSV cy1.CSV  dlt.CSV NA     dov.CSV NA        ds.CSV  
2 NA      cy24.CSV NA      NA     NA      NA        ds_1.CSV
3 NA      cy6.CSV  NA      NA     NA      NA        NA      
库(purrr)
图书馆(stringr)
map_df(df,~str_replace_all(.x,str_c(RM,collapse='|'),NA_字符)
#一个tibble:3x7
cy3.CSV cy6.CSV dlt.CSV dm.CSV dov.CSV dov_1.CSV ds.CSV
1 cy3.CSV cy1.CSV dlt.CSV NA dov.CSV NA ds.CSV
2 NA cy24.CSV NA NA ds_1.CSV
3 NA cy6.CSV NA NA NA

我们可以跨
使用
变异

library(dplyr)
df %>% 
   mutate(across(everything(), ~ replace(., . %in% RM, NA)))
-输出

# A tibble: 3 x 7
#  cy3.CSV cy6.CSV  dlt.CSV dm.CSV dov.CSV dov_1.CSV ds.CSV  
#  <chr>   <chr>    <chr>   <chr>  <chr>   <chr>     <chr>   
#1 cy3.CSV cy1.CSV  dlt.CSV <NA>   dov.CSV <NA>      ds.CSV  
#2 <NA>    cy24.CSV <NA>    <NA>   <NA>    <NA>      ds_1.CSV
#3 <NA>    cy6.CSV  <NA>    <NA>   <NA>    <NA>      <NA>    
#一个tible:3 x 7
#cy3.CSV cy6.CSV dlt.CSV dm.CSV dov.CSV dov_1.CSV ds.CSV
#                         
#1 cy3.CSV cy1.CSV dlt.CSV dov.CSV ds.CSV
#2 cy24.CSV ds_1.CSV
#3.cy6.CSV

这应该可以。是否也可以将其列为NA?我只想要和其他空手机一样的东西。@Stataq,已经更新了我的答案,请检查是否有效。谢谢。它起作用了。