是否有一个R函数,用于在不使用循环的情况下根据另一列的修改版本对列进行重新编码?

是否有一个R函数,用于在不使用循环的情况下根据另一列的修改版本对列进行重新编码?,r,dataframe,R,Dataframe,我目前正在从事一个项目,该项目需要根据另一个领域的检测结果对一个领域进行重新编码,如下所示。对于第二行中的情况,我需要重新编码Col1,使其类似于Col2中的值。在重新编码这些值之后,我需要过滤数据集,以便只保留Col2中具有Col1值的行 Col1 Col2 CN234 CN234 WO/123 WO/0123 KR567 KR456 我目前有以下代码,但不起作用: df$Col3= paste(str_split(df$Col1,"/")[[1]][1],"/",

我目前正在从事一个项目,该项目需要根据另一个领域的检测结果对一个领域进行重新编码,如下所示。对于第二行中的情况,我需要重新编码Col1,使其类似于Col2中的值。在重新编码这些值之后,我需要过滤数据集,以便只保留Col2中具有Col1值的行

Col1     Col2 
CN234    CN234
WO/123   WO/0123
KR567    KR456
我目前有以下代码,但不起作用:

df$Col3= paste(str_split(df$Col1,"/")[[1]][1],"/","0",str_split(df$Col1,"/")[[1]][2])
df$check=str_detect(df$Col2,stringr::fixed(df$Col1))
df[which(df$check!=TRUE),]$Col1=df[which(df$check!=TRUE),]$Col3
df$check=str_detect(df$Col2,stringr::fixed(df$Col1))
df2<-df[which(df$check==TRUE),]

有人能帮我吗?

如果我理解正确,两列匹配

  • 前导的两个字母是相同的
  • 尾随数字,即各自的整数值是相同的
这是我使用首选工具所要做的:

library(data.table)
library(magrittr)
library(stringr)

df <- fread("Col1     Col2 
CN234    CN234
WO/123   WO/0123
KR567    KR456")

df[str_extract(Col1, "^[[:alpha:]]{2}") == str_extract(Col2, "^[[:alpha:]]{2}") &
     str_extract(Col1, "\\d+$") %>% as.integer() == str_extract(Col2, "\\d+$") %>% as.integer()][
       , Col1 := Col2][]

在这里,首先过滤数据集中满足上述条件的行,然后复制列。

如果我理解正确,则两列匹配

  • 前导的两个字母是相同的
  • 尾随数字,即各自的整数值是相同的
这是我使用首选工具所要做的:

library(data.table)
library(magrittr)
library(stringr)

df <- fread("Col1     Col2 
CN234    CN234
WO/123   WO/0123
KR567    KR456")

df[str_extract(Col1, "^[[:alpha:]]{2}") == str_extract(Col2, "^[[:alpha:]]{2}") &
     str_extract(Col1, "\\d+$") %>% as.integer() == str_extract(Col2, "\\d+$") %>% as.integer()][
       , Col1 := Col2][]

在这里,首先过滤数据集中满足上述条件的行,然后复制列。

请告诉我,示例数据集的预期结果是什么?您好,我已将预期结果添加到原始帖子中。为什么第2行被重新编码,而第3行没有被重新编码?最终结果是保留Col2中存在的Col1中具有值的行,但是KR 456与Col2中的值不匹配。我曾试图在(Col3)中添加一个新列来重新编码所有值,但只在Col1中捕获那些尚未与Col2中的值匹配的值。[/edit]对不起,误解了你的问题。最初,基于Col1和Col2之间的匹配过滤数据被认为是足够的,但我们发现有些行需要额外的零。这是一个两步检查。请问您的样本数据集的预期结果是什么?您好,我已将预期结果添加到原始帖子中。为什么第2行被重新编码,而第3行没有被重新编码?最终结果是保留Col1中具有Col2中存在的值的行,但KR 456与Col2中的值不匹配。我曾试图在(Col3)中添加一个新列来重新编码所有值,但只在Col1中捕获那些尚未与Col2中的值匹配的值。[/edit]对不起,误解了你的问题。最初,基于Col1和Col2之间的匹配过滤数据被认为是足够的,但我们发现有些行需要额外的零。所以这是一个两步检查。
      Col1    Col2
1:   CN234   CN234
2: WO/0123 WO/0123