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_match
执行与 real_value
列的模糊匹配。
然而,在某些情况下,模糊匹配的效果不佳或
real_value
可能是 impossible/hard 来检测(real_value
列具有用户插入的值。在某些情况下,这些输入未正确插入,因此甚至很难知道它指的是什么喜欢 MSTER 手机壳)。
我想做的是每行 select 重复次数最多的记录,如果有 none,则不要像下面的示例那样 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
中执行此操作。我想知道是否有人知道执行此操作的方法?
如果没有唯一模式,我们可以将 How to find the statistical mode FAQ 的最佳答案调整为 return 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)])
}
然后我们需要将此函数应用于每一行的匹配列。
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>
晚上好。
目前我有一个 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_match
执行与 real_value
列的模糊匹配。
然而,在某些情况下,模糊匹配的效果不佳或
real_value
可能是 impossible/hard 来检测(real_value
列具有用户插入的值。在某些情况下,这些输入未正确插入,因此甚至很难知道它指的是什么喜欢 MSTER 手机壳)。
我想做的是每行 select 重复次数最多的记录,如果有 none,则不要像下面的示例那样 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
中执行此操作。我想知道是否有人知道执行此操作的方法?
如果没有唯一模式,我们可以将 How to find the statistical mode FAQ 的最佳答案调整为 return 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)])
}
然后我们需要将此函数应用于每一行的匹配列。
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>