如果许多列包含字符串,则为该行输入值
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"
.
我有一个名为 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"
.