我有一個名為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”;第二列必須在 11 個 FAC_ 變數中搜索所有包含“Alternancia”的值,如果包含字串,則替換為“1”,如果不包含字串,則替換為“0”,其余所有列都相同.
為了實作這一點,我的代碼如下:
矢量容器是我必須在資料框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.
但是我在沒有創建變數的代碼中有一個問題,我檢查了很多次但我無法解決問題。
我會很高興有人可以幫助我。非常感謝!!
uj5u.com熱心網友回復:
1. 如果你想要一個 var 中的單個數字(1 或 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. 如果你想要 1 或 0 為 11 個 FAC_ 中的每一個,并且 this 在每個 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如果未找到該單詞。如果要在找不到單詞時更改值,請NA在 ifelse 函式中進行修改,例如使用"Not found".
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/457237.html
上一篇:如何根據python中其他列的單元格條件移動列的位置
下一篇:在結果中添加一個額外的行
