【问题标题】:r replace part of a string with lookupr 用查找替换字符串的一部分
【发布时间】:2018-12-18 12:43:16
【问题描述】:

我有两个数据框:

DF1:映射 - 两列

code | value
SDR111X | 10
DER333F | 15

DF2:数据 - 一列(我在脚本中添加了另外两列 - 如下)

string
AA.SDR111X AS SDR111X
AB.SDR111X AS SDR111X
DD.YRE999C AS YRE999C

目的是遍历 DF1,对于每一行,查看 DF2 并将 CODE 的 SECOND 匹配替换为 VALUE,我期望的结果:

string
AA.SDR111X AS 10
AB.SDR111X AS 10
DD.YRE999C AS YRE999C

此时我已经开始尝试解决需求的替换部分。

之后我会处理代码的迭代部分!

我尝试了以下但没有成功 - 代码运行正常,但没有更改任何值:

library(tidyverse)

data <- data
data <- data %>%
  mutate(lhs = substr(X__1, 1, 14)) %>%
  mutate(rhs = substr(X__1, 15, 200))

pattern <- "SDR111X"
replacement <- "10"

str_replace_all(data$rhs, pattern, replacement)

同样的事情发生在这里:

library(tidyverse)

data <- data
data <- data %>%
  mutate(lhs = substr(X__1, 1, 14)) %>%
  mutate(rhs = substr(X__1, 15, 200))

data <- data %>%
  mutate(rhs1 = replace(rhs, rhs=="SDR111X", 10))

感谢您的帮助

【问题讨论】:

  • 请使用dput() 函数提供数据(DF1 中的| 具有误导性)

标签: r regex vector replace


【解决方案1】:

在执行替换之前使用fuzzyjoin 包连接两个数据帧的解决方案可以解决该问题。

library(dplyr)
library(fuzzyjoin)

DF2 %>% regex_left_join(DF1, by = c("string" = "code")) %>%
  rowwise() %>%
  mutate(string = gsub(paste(code,"$",sep=""), value, string)) %>%
  select(string)

# # A tibble: 3 x 1
#        string               
#        <chr>                
# 1 AA.SDR111X AS 10     
# 2 AB.SDR111X AS 10     
# 3 DD.YRE999C AS YRE999C

数据:

DF1 <- read.table(text = 
"code  value
SDR111X  10
DER333F  15",
header = TRUE, stringsAsFactors = FALSE)


DF2 <- read.table(text = 
"string
'AA.SDR111X AS SDR111X'
'AB.SDR111X AS SDR111X'
'DD.YRE999C AS YRE999C'",
header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    这是一个使用 tidyverse 世界的通用解决方案。

    df1<-read.table(header=TRUE, text="code  value
    SDR111X  10
    DER333F  15")
    df2<-data.frame(string= c('AA.SDR111X AS SDR111X', 'AB.SDR111X AS SDR111X', 'DD.YRE999C AS YRE999C' ))
    
    
    library(dplyr)
    library(stringr)
    
    #find what to match (last word in the string)
    df2$match<-str_extract(df2$string, "\\w+$")
    #make the join using the match and code columns
    df2<-left_join(df2, df1, by=c("match"="code"))
    #fill in the NA with the original word in the string
    df2$value[is.na(df2$value)]<-df2$match[is.na(df2$value)]
    
    #final answer
    answer<-data.frame(string=str_replace(df2$string, "\\w+$", df2$value))
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 1970-01-01
      • 2020-07-28
      • 2023-02-13
      • 2021-03-01
      相关资源
      最近更新 更多