如果许多列包含字符串,则为该行输入值

If Many Columns Contains String then enter value for that row

我有一个名为 bd 的数据框,看起来像这样:

数据帧是这个Link Basedatos

   FAC_1                                       FAC_2                     FAC_3 FAC_4 FAC_5 FAC_6 FAC_7 FAC_8 FAC_9 FAC_10 FAC_11
   <chr>                                       <chr>                     <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>  <chr> 
 1 Substrato de mala calidad (muy meteorizado) "  Naturaleza del suelo ~ "  M~  NA    NA    NA   NA    NA    NA    NA     NA    
 2 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  N~ "  M~ "  M~  NA   NA    NA    NA    NA     NA    
 3 NA                                           NA                        NA    NA    NA    NA   NA    NA    NA    NA     NA    
 4 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  R~ "  O~ "  P~ "  M~ NA    NA    NA    NA     NA    
 5 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  R~ "  O~ "  N~ "  P~ NA    NA    NA    NA     NA    
 6 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  R~ "  P~ "  M~  NA   NA    NA    NA    NA     NA    
 7 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  R~ "  N~ "  P~ "  M~ NA    NA    NA    NA     NA    
 8 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  M~ "  P~ "  M~  NA   NA    NA    NA    NA     NA    
 9 Substrato de mala calidad (muy meteorizado) "  Alternancia de rocas ~ "  R~ "  N~ "  P~ "  M~ NA    NA    NA    NA     NA    
10 Substrato de mala calidad (muy meteorizado) "  Rocas muy fracturadas~ "  O~ "  N~ "  M~ "  P~ NA    NA    NA    NA     NA   

所以我需要创建 11 个新列,第一列必须在 11 个 FAC_ 变量中搜索所有包含“Substrato”的值,如果包含字符串则替换为“1”,否则替换为“0”包含字符串;第二列必须在十一个 FAC_ 变量中搜索所有包含“Alternancia”的值,如果包含字符串则替换为“1”,如果不包含字符串则替换为“0”,其余所有列都相同.

为此,我的代码如下:

矢量 containers 是我必须在数据帧 bd 中找到的字符串。

vect <- 1:11 #index vector
variables <- paste("FAC", vect, sep = "_") # variables names
containers <- c("Substrato","Alternancia", "Presencia", "fracturadas","desfavorable",
                "Naturaleza", "Material", "Pendiente", "Morfología", "escacez", "Otro") # strings to find

bd$var1 <- character() #empty new column

# Create the first new column with "Substrato" like string:

for (i in 1:length(vect)){
  out <- if_else(grepl(containers[1], bd[ ,i]), "1", "0") 
  bd$var1<- c(var1, out)
}

#For the next columns I changed containers[1] by containers[2],[3],[4],....[11] and var1 by var2,3,4,..11.

但是我的代码有问题,没有创建变量,我检查了很多次都没有解决问题

I am going to feel so happy is someone can help me. Thank so much!!

1.如果你想要 var (1 or 0)

中的单个数字

1 = 在同一行的所有 11 个 FAC_ 变量中至少找到一次来自容器的相应字符串

使用 tidyverse:

library(tidyverse)
for (i in seq_along(containers)){
  bd <- bd %>%
    mutate(!!sym(paste0("var",i)) := apply(bd[,1:11], 1, function(vec){str_detect(vec, containers[i]) %>% any(na.rm=T) %>% as.numeric}))
}

输出

> bd
# A tibble: 35,279 x 22
   FAC_1    FAC_2    FAC_3    FAC_4    FAC_5   FAC_6  FAC_7 FAC_8 FAC_9 FAC_10 FAC_11  var1  var2  var3  var4  var5  var6  var7  var8  var9 var10 var11
   <chr>    <chr>    <chr>    <chr>    <chr>   <chr>  <lgl> <lgl> <lgl> <lgl>  <lgl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 Substra~ Natural~ "Morfol~  NA       NA      NA    NA    NA    NA    NA     NA         1     0     0     0     0     1     0     0     0     0     0
 2 Substra~ Alterna~ "Natura~ "Materi~ "Morfo~  NA    NA    NA    NA    NA     NA         1     1     0     0     0     1     1     0     0     0     0
 3 NA       NA        NA       NA       NA      NA    NA    NA    NA    NA     NA         0     0     0     0     0     0     0     0     0     0     0
 4 Substra~ Alterna~ "Rocas ~ "Orient~ "Pendi~ "Morf~ NA    NA    NA    NA     NA         1     1     0     1     1     0     0     1     0     0     0
 5 Substra~ Alterna~ "Rocas ~ "Orient~ "Natur~ "Pend~ NA    NA    NA    NA     NA         1     1     0     1     1     1     0     1     0     0     0
 6 Substra~ Alterna~ "Rocas ~ "Pendie~ "Morfo~  NA    NA    NA    NA    NA     NA         1     1     0     1     0     0     0     1     0     0     0
 7 Substra~ Alterna~ "Rocas ~ "Natura~ "Pendi~ "Morf~ NA    NA    NA    NA     NA         1     1     0     1     0     1     0     1     0     0     0
 8 Substra~ Alterna~ "Materi~ "Pendie~ "Morfo~  NA    NA    NA    NA    NA     NA         1     1     0     0     0     0     1     1     0     0     0
 9 Substra~ Alterna~ "Rocas ~ "Natura~ "Pendi~ "Morf~ NA    NA    NA    NA     NA         1     1     0     1     0     1     0     1     0     0     0
10 Substra~ Rocas m~ "Orient~ "Natura~ "Mater~ "Pend~ NA    NA    NA    NA     NA         1     0     0     1     1     1     1     1     0     0     0
# ... with 35,269 more rows

2。如果你想为 11 个 FAC_ 中的每一个设置一个 1 或 0,并且在每个 var

中都有这个

我把 1 和 0 放在一个列表中,所以 var1 是一个列表向量。每个元素都是一个包含 11 个数字的列表。

for (i in seq_along(containers)){
  bd <- bd %>%
    mutate(!!sym(paste0("var",i)) := apply(bd[,1:11], 1, function(vec){map(vec, ~grepl(containers[i], .) %>% as.numeric)}))
}

计算需要一点时间,但我找到了

输出

> bd
# A tibble: 35,279 x 22
   FAC_1   FAC_2   FAC_3   FAC_4   FAC_5   FAC_6  FAC_7 FAC_8 FAC_9 FAC_10 FAC_11 var1   var2   var3   var4   var5  var6  var7  var8  var9  var10 var11
   <chr>   <chr>   <chr>   <chr>   <chr>   <chr>  <lgl> <lgl> <lgl> <lgl>  <lgl>  <list> <list> <list> <list> <lis> <lis> <lis> <lis> <lis> <lis> <lis>
 1 Substr~ Natura~ "Morfo~  NA      NA      NA    NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 2 Substr~ Altern~ "Natur~ "Mater~ "Morfo~  NA    NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 3 NA      NA       NA      NA      NA      NA    NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 4 Substr~ Altern~ "Rocas~ "Orien~ "Pendi~ "Morf~ NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 5 Substr~ Altern~ "Rocas~ "Orien~ "Natur~ "Pend~ NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 6 Substr~ Altern~ "Rocas~ "Pendi~ "Morfo~  NA    NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 7 Substr~ Altern~ "Rocas~ "Natur~ "Pendi~ "Morf~ NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 8 Substr~ Altern~ "Mater~ "Pendi~ "Morfo~  NA    NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
 9 Substr~ Altern~ "Rocas~ "Natur~ "Pendi~ "Morf~ NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
10 Substr~ Rocas ~ "Orien~ "Natur~ "Mater~ "Pend~ NA    NA    NA    NA     NA     <name~ <name~ <name~ <name~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~ <nam~
# ... with 35,269 more rows
> bd$var1[1]
[[1]]
[[1]]$FAC_1
[1] 1

[[1]]$FAC_2
[1] 0

[[1]]$FAC_3
[1] 0

[[1]]$FAC_4
[1] 0

[[1]]$FAC_5
[1] 0

[[1]]$FAC_6
[1] 0

[[1]]$FAC_7
[1] 0

[[1]]$FAC_8
[1] 0

[[1]]$FAC_9
[1] 0

[[1]]$FAC_10
[1] 0

[[1]]$FAC_11
[1] 0

编辑:如果您想要我们在单元格中找到单词的整个字符串

如果你确定每个单词在一行中只能出现一次,你可以这样做

for (i in seq_along(containers)){
  bd <- bd %>%
    mutate(!!sym(paste0("var",i)) := apply(bd[,1:11], 1, function(vec){ifelse(str_detect(vec, containers[i]) %>% any(na.rm=T),
                                                                              str_subset(vec, containers[i]),
                                                                              NA)}))
}
如果找到单词,

用单元格的值填充,如果没有找到单词,NA。如果要在找不到单词时更改值,请修改 ifelse 函数中的 NA,例如 "Not found".