【问题标题】:Replace data entry errors with the most common value - dplyr用最常见的值替换数据输入错误 - dplyr
【发布时间】:2021-03-22 01:06:43
【问题描述】:

我有一个包含一些数据输入错误的数据框。

我希望用每组最常见的值替换每组的这些异常值。

我的数据如下:

df <- data.frame(CODE = c("J1745","J1745","J1745","J1745","J1100","J1100","J1100","J1100","J1100","J1100"),NDC = c(1234,1234,1234,1234,5678,5678,5678,5678,5678,5678),DOSAGE = c("10ML","10 ML","10 ML","10 ML","5 ML","5 ML","5 ML","5 ML","50 ML","5 ML"),DESC = c("TEXT1","TEXT 1","TEXT 1","TEXT 1","TEXT 2","TEXT 2","TEXT 2","TEXT 2","TEXT 10","TEXT 2"))

如您所见,我的 DOSAGEDESC 列包含一些不一致之处,我想将它们替换为每个组中最常见的值。

我想要的输出如下所示:

【问题讨论】:

  • 为什么要用最常见的值替换?这不是一个好习惯。我认为最好尝试使用一些正则表达式来尝试将它们替换为正确的值,而不仅仅是按最常见的类别进行估算。
  • 您能否将您的输入和输出示例发布为文本(代码块)而不是屏幕截图?它更易于访问...
  • 您接受了@RonakShah 的回答,但请参阅我的评论,了解为什么这可能不是您想要的。您能否澄清一下您的意思/如何定义“异常值”?跨度>

标签: r dplyr


【解决方案1】:

我同意这有潜在危险的评论。

下面的代码将出现

repl_common <- function(x,n=1) {
    tt <- tapply(x,x,length)          ## count number of instances
    m <- names(tt)[which.max(tt)]     ## find mode
    x[tt[as.character(x)]<=n] <- m    ## replace
    return(x)
}
## apply by group across specified columns
df %>% group_by(CODE) %>% mutate(across(c(DOSAGE,DESC), repl_common))

【讨论】:

  • 将函数的第一行替换为对tabulate() 的调用可能会更简洁一些。
【解决方案2】:

您可以使用here 中的Mode 函数来获取最常见的值。

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

按组应用此功能。

library(dplyr)
df %>% group_by(CODE, NDC) %>% mutate(across(c(DOSAGE, DESC), Mode)) %>% ungroup

#    CODE    NDC DOSAGE DESC  
#   <chr> <dbl> <chr>  <chr> 
# 1 J1745  1234 10 ML  TEXT 1
# 2 J1745  1234 10 ML  TEXT 1
# 3 J1745  1234 10 ML  TEXT 1
# 4 J1745  1234 10 ML  TEXT 1
# 5 J1100  5678 5 ML   TEXT 2
# 6 J1100  5678 5 ML   TEXT 2
# 7 J1100  5678 5 ML   TEXT 2
# 8 J1100  5678 5 ML   TEXT 2
# 9 J1100  5678 5 ML   TEXT 2
#10 J1100  5678 5 ML   TEXT 2 

【讨论】:

  • 这确实匹配所需的输出,但它并没有按照 OP 所说的那样做。这会将组中的 所有 值替换为模式。 OP 说他们想用模式替换“异常值”(未明确定义)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-11-01
  • 1970-01-01
相关资源
最近更新 更多