繁体   English   中英

Select R data.table 中每行重复次数最多的项目

[英]Select most repeated item per row in R data.table

晚上好。

目前我有一个 R data.table具有以下结构

name_match1 | name_match2 | name_match3 | real_value
COCA COLA     CACAO         COCA COLA     COCA.COLA
PEPSI         PEPSI         PEPSI         PEPCSI
MONSTER       MORE          MIRINDA       MSTER

其中每个name_matchreal_value列执行模糊匹配。 但是,在某些情况下,模糊匹配效果不佳或real_value可能无法/难以检测( real_value列具有用户插入的值。这些输入在某些情况下未正确插入,因此使甚至很难知道它指的是什么,比如 MSTER 案例)。

我想做的是每行 select 重复最多的记录,如果没有,那么不要 select 像下面的例子:

name_match1 | name_match2 | name_match3 | real_value | most_repeated_value | Times_repeated
COCA COLA     CACAO         COCA COLA     COCA.COLA    COCA COLA                  2
PEPSI         PEPSI         PEPSI         PEPCSI       PEPSI                      3
MONSTER       MORE          MIRINDA       MSTER        NULL                       0

但是我不知道如何在 R data.table中执行此操作。 我想知道是否有人知道执行此操作的方法?

如果没有唯一模式,我们可以调整如何查找统计模式常见问题解答中的最佳答案以返回NA

Mode <- function(x) {
  ux <- unique(x)
  tab = tabulate(match(x, ux))
  if(length(which(max(tab) == tab)) > 1) return(NA)
  return(ux[which.max(tab)])
}

然后我们需要将此 function 应用于每行的匹配列。

library(data.table)
dat = fread(text = 'name_match1  name_match2  name_match3  real_value
"COCA COLA"     CACAO         "COCA COLA"     COCA.COLA
PEPSI         PEPSI         PEPSI         PEPCSI
MONSTER       MORE          MIRINDA       MSTER')

dat[, result := apply(dat[, 1:3], 1, Mode)]
dat
#    name_match1 name_match2 name_match3 real_value    result
# 1:   COCA COLA       CACAO   COCA COLA  COCA.COLA COCA COLA
# 2:       PEPSI       PEPSI       PEPSI     PEPCSI     PEPSI
# 3:     MONSTER        MORE     MIRINDA      MSTER      <NA>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM