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

Posted

技术标签:

【中文标题】是否有一个 R 函数用于在不使用循环的情况下根据另一列的修改版本重新编码列?【英文标题】:Is there an R function for recoding a column based on a modified version of another without using a loop? 【发布时间】:2020-01-06 09:23:39 【问题描述】:

我目前正在开展一个项目,该项目需要根据另一个字段中的检测对一个字段进行重新编码,如下所示。对于第二行的情况,我需要重新编码 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),]

目前第一行代码只对第一行进行字符串计算,并在数据帧的其余部分重复它。

预期的结果是:

Col1     Col2
CN234    CN234
WO/0123  WO/0123

谁能帮我解决这个问题?

【问题讨论】:

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

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

前两个字母相同 尾随数字,即各自的整数值,是相同的。

这就是我会用我喜欢的工具做的事情:

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][]
      Col1    Col2
1:   CN234   CN234
2: WO/0123 WO/0123

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

【讨论】:

以上是关于是否有一个 R 函数用于在不使用循环的情况下根据另一列的修改版本重新编码列?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不使用 LoadLibrary 的情况下将函数“复制”到另一个进程中并在线程中执行它?

如何在不使用循环的情况下将json分配给另一个[重复]

如何在不单击tkinter python的情况下读取单选按钮值

是否可以在不使用 python 移动终端行的情况下在同一位置打印“for循环”表?

R:如何在不使用循环的情况下按唯一向量顺序查找所有重复向量值的索引?

如何在不跟踪索引的情况下将元素附加到列表中?