我想在資料框中創建一個匹配變數
- 如果另一個變數(字串)的值包含在第三個變數(字串)的值中,則為 1
- 如果不是這種情況,則為 0
- 如果任一字串變數為 NA,則為 NA
到目前為止,我已經嘗試過(來自 sjmisc 包的 str_contains 函式):
df$match[(df$str1 == "left" & str_contains(df$str2, "left"))
| (df$str1== "right" & str_contains(df$str2, "right"))] = 1
df$match[(df$str1== "left" & str_contains(df$str2, "left", logic = "not"))
| (df$str1== "right" & str_contains(df$str2, "right", logic = "not"))] = 0
df$match[is.na(df$str1)| is.na(df$str2)] = NA
但只有 NA 部分運行良好,其余部分我得到所有 rows = 1 根據資料不正確。
資料示例:
| str1 | str2 | 匹配 |
|---|---|---|
| 剩下 | 對 | - |
| 對 | 有點左 | - |
| 剩下 | 很左 | - |
| 對 | 對 | - |
| 對 | 有點對 | - |
match 在示例中應為 0,0,1,1,1,但最終全部為 1。我將不勝感激這里有什么問題的任何建議或實作我想要的結果的替代方法!
uj5u.com熱心網友回復:
library(tidyverse)
data <- tribble(
~str1, ~str2, ~match,
"left", "right", "-",
"right", "somewhat left", "-",
"left", "very left", "-",
"right", "right", "-",
"right", "somewhat right", "-",
NA, NA, "-"
)
data %>%
mutate(
match = ifelse(str_detect(str2, str1), 1, 0)
)
#> # A tibble: 6 × 3
#> str1 str2 match
#> <chr> <chr> <dbl>
#> 1 left right 0
#> 2 right somewhat left 0
#> 3 left very left 1
#> 4 right right 1
#> 5 right somewhat right 1
#> 6 <NA> <NA> NA
由reprex 包于 2022-05-23 創建 (v2.0.0 )
uj5u.com熱心網友回復:
一個base解決方案:
within(df, {
match <- mapply(grepl, str1, str2)
})
# str1 str2 match
# 1 left right 0
# 2 right somewhat left 0
# 3 left very left 1
# 4 right right 1
# 5 right somewhat right 1
# 6 <NA> <NA> NA
資料
df <- structure(list(str1 = c("left", "right", "left", "right", "right",
NA), str2 = c("right", "somewhat left", "very left", "right",
"somewhat right", NA)), row.names = c(NA, -6L), class = "data.frame")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/480400.html
