R语言 匹配符号前后的字符串

yshpjwxd  于 2023-02-17  发布在  其他
关注(0)|答案(5)|浏览(231)

| 第1栏|假人|
| - ------|- ------|
| 编号:F25J2205/02|1个|
| 入F33J 4416/07|无|
我试图创建上面的:如果在'/'之前至少有一个整数,在'/'之后也是一个整数,那么1,否则0,我也在尝试对大数据集这样做。
从上面我们可以看到,在'/'之前有几个2,在'/'之后也有一个2。因此我使用1。第二行不是这样,所以0
注意在这个例子中,我在'/'之前有8位数。这可能不是这样的,也就是说,它可能是5,2等。同样重要的是要注意,我在变量中有间隙,即中断。
谢谢!

fafcakar

fafcakar1#

    • 更新:**在澄清OP和@Darren Tsai之后。如果0也适用于规则,我们可以这样做:
#data
df1 <- read.table(text = "
Col1    Dummy
F25J2205/02     1
F33J4416/07     0
F03J4416/07     1", header = TRUE)

library(tidyverse)
df1 %>% 
  separate(Col1, c("a", "b"), remove = FALSE) %>% 
  mutate(Dummy = if_else(str_detect(a, paste0(strsplit(b, "")[[1]], collapse = "|")), 1, 0), 
         .keep = "unused")

输出:

Col1 Dummy
1 F25J2205/02     1
2 F33J4416/07     0
3 F03J4416/07     1
    • 第一个答案:**

这里是另一个选项:
一个二个一个一个

zzzyeukh

zzzyeukh2#

下面是使用包stringr的方法。

df1 <- read.table(text = "
Col1    Dummy
F25J2205/02     1
F33J4416/07     0", header = TRUE)

library(stringr)

createDummy <- function(x) {
  y <- sub("\\D(\\d+/\\d+)", "\\1", x)
  sapply(strsplit(y, "/"), \(x) {
    y <- str_split_1(x[1], "")
    +any(str_detect(x[2], y))
  })
}

createDummy(df1$Col1)
#> [1] 1 0

创建于2023年2月11日,使用reprex v2.0.2

omqzjyyz

omqzjyyz3#

base解决方案:

df <- data.frame(Col = c("F25J2205/02", "F33J4416/07"))

df$dummy <- +(lengths(lapply(strsplit(df$Col, '/'), \(x) {
  do.call(intersect, strsplit(gsub('\\D', '', x), ''))
})) > 0)

df
#           Col dummy
# 1 F25J2205/02     1
# 2 F33J4416/07     0
lztngnrs

lztngnrs4#

正则表达式解决方案:
首先,我们从/0之前提取在/0之后重复的所有数字(注意反向引用\\1的使用),然后我们将结果减少为unique值,以最终查看结果是否包含d igit,在这种情况下,1被授予:

library(tidyverse)
df %>%
  mutate(Dummy = lapply(str_extract_all(Col, "(\\d)(?=.*/0\\1)"),
                        function(x) +str_detect(unique(x), "\\d")))
          Col Dummy
1 F25J2205/02     1
2 F33J4416/07
bwleehnv

bwleehnv5#

tidyverse的另一个选项

library(dplyr)
library(tidyr)
library(stringr)
df1 %>%
  mutate(Col2 = str_remove_all(Col1, "[A-Z]+")) %>% 
  separate_wider_regex(Col2, c(lhs = "\\d+", "/", rhs = "\\d+")) %>% 
  mutate(rhs = str_replace(rhs, "(?<=\\d)(?=\\d)", "|")) %>% 
  transmute(Col1, dummy = +(str_detect(lhs, rhs)))
  • 输出
# A tibble: 3 × 2
  Col1        dummy
  <chr>       <int>
1 F25J2205/02     1
2 F33J4416/07     0
3 F03J4416/07     1

相关问题