【问题标题】:R after median imputation nothing changes中位数插补后的 R 没有任何变化
【发布时间】:2021-06-04 18:21:36
【问题描述】:

有人知道这里会发生什么吗?我正在尝试对 NA 值进行估算,但我一无所获。这是我的数据框。我将整个内容包括在内只是因为我认为拥有完整内容而不是前 n 行可能会有所帮助:

structure(list(INDEX = 1:6, TARGET_WINS = c(39L, 70L, 86L, 70L, 
82L, 75L), TEAM_BATTING_H = c(1445L, 1339L, 1377L, 1387L, 1297L, 
1279L), TEAM_BATTING_2B = c(194L, 219L, 232L, 209L, 186L, 200L
), TEAM_BATTING_3B = c(39L, 22L, 35L, 38L, 27L, 36L), TEAM_BATTING_HR = c(13L, 
190L, 137L, 96L, 102L, 92L), TEAM_BATTING_BB = c(143L, 685L, 
602L, 451L, 472L, 443L), TEAM_BATTING_SO = c(842, 1075, 917, 
922, 920, 973), TEAM_BASERUN_SB = c(NA, 37L, 46L, 43L, 49L, 107L
), TEAM_BASERUN_CS = c(NA, 28L, 27L, 30L, 39L, 59L), TEAM_BATTING_HBP = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_
), TEAM_PITCHING_H = c(9364L, 1347L, 1377L, 1396L, 1297L, 1279L
), TEAM_PITCHING_HR = c(84L, 191L, 137L, 97L, 102L, 92L), TEAM_PITCHING_BB = c(927L, 
689L, 602L, 454L, 472L, 443L), TEAM_PITCHING_SO = c(5456L, 1082L, 
917L, 928L, 920L, 973L), TEAM_FIELDING_E = c(1011L, 193L, 175L, 
164L, 138L, 123L), TEAM_FIELDING_DP = c(NA, 155L, 153L, 156L, 
168L, 149L)), row.names = c(NA, 6L), class = "data.frame")

我看看是否有任何 NA 值

any(is.na(moneyball_training_data)) # TRUE

我发现这些 NA 值在哪里:

moneyball_training_data %>% summarise(across(, ~ any(is.na(.x))))

我查看具有 NA 值的变量之一的类

class(moneyball_training_data$TEAM_BATTING_SO) # numeric
  

我尝试用该向量的中值来估算它:

moneyball_training_data$TEAM_BATTING_SO[moneyball_training_data$TEAM_BATTING_SO == NA] <- median(moneyball_training_data$TEAM_BATTING_SO)

any(is.na(moneyball_training_data$TEAM_BATTING_SO)) # TRUE

但当我询问是否有 NA 值时,我仍然得到 TRUE...

但也许我忘记在 medican 的函数调用中删除 NA,所以我再次尝试使用 na.rm = TRUE

moneyball_training_data$TEAM_BATTING_SO[moneyball_training_data$TEAM_BATTING_SO == NA] <- median(moneyball_training_data$TEAM_BATTING_SO, na.rm = TRUE)

any(is.na(moneyball_training_data$TEAM_BATTING_SO)) # TRUE

但这不起作用。所以我以另一种方式找到中值,然后使用该值进行插补:

median(moneyball_training_data$TEAM_BATTING_SO, na.rm = TRUE) # 750

moneyball_training_data$TEAM_BATTING_SO[moneyball_training_data$TEAM_BATTING_SO == NA] <- 750

any(is.na(moneyball_training_data$TEAM_BATTING_SO)) # TRUE

但这并不意味着 NA 值是 750。但也许我应该只使用 "" 而不是 NA:

moneyball_training_data$TEAM_BATTING_SO[moneyball_training_data$TEAM_BATTING_SO == ""] <- 750

any(is.na(moneyball_training_data$TEAM_BATTING_SO)) # TRUE

但这也不起作用。有谁知道为什么这种插补不起作用?

【问题讨论】:

  • 尝试使用is.na() 而不是== NA

标签: r imputation


【解决方案1】:

在为子集创建boolean 向量时,您应该使用您之前和之后已经正确使用过的is.na()

moneyball_training_data$TEAM_BATTING_SO[is.na(moneyball_training_data$TEAM_BATTING_SO)] <- median(moneyball_training_data$TEAM_BATTING_SO, na.rm = TRUE)

any(is.na(moneyball_training_data$TEAM_BATTING_SO)) #
# [1] FALSE

【讨论】:

  • 这非常感谢您的回答。我不认为按照您的建议将 is.na 放入向量中。为什么 is.na 有效而 == NA 或 == "" 无效?
  • == "" 不起作用仅仅是因为data.frame() 中的缺失值被编码为NA 而不是""。至于为什么== NA 不起作用,回答起来有点棘手。 ?"=="R 文档表明 NA 的缺失值被视为不可比较。
猜你喜欢
  • 2017-02-13
  • 2013-02-24
  • 2012-10-18
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多