【问题标题】:How to reassign values to existing columns of a data.table using lapply? [duplicate]如何使用 lapply 将值重新分配给 data.table 的现有列? [复制]
【发布时间】:2017-05-16 14:42:38
【问题描述】:

我想用该列的中值更新数值列中的 NA。

dt <- data.table(
  name = c("A","B","C","D","E"),
  sex = c("M","F",NA,"F","M"),
  age = c(1,2,3,NA,4),
  height = c(178.1, 162.1, NA, 169.5, 172.3)
)

提取数字列

num.cols <-  sapply(dt, is.numeric)
num.cols <- names(num.cols)[num.cols]

检查值

median(dt[,age], na.rm = T) # 2.5
median(dt[,height], na.rm = T) #170.9

对每个 num.cols 使用 lapply

dt[,lapply(.SD, function(value) 
ifelse(is.na(value), median(value, na.rm=TRUE), value)),
.SDcols = num.cols]

问题,我无法弄清楚如何用 data.table 语法中的估算中位数向量覆盖带有 NA 的向量?

【问题讨论】:

  • 你快到了,要覆盖你想要的列,只需在 lapply 之前使用 (num.cols) :=
  • @MikeH。谢谢,我不知道我是怎么错过的。

标签: r data.table lapply


【解决方案1】:

我们可以使用zoo 中的na.aggregate 并将FUN 指定为median 来用median.SDcols 中指定的选定列填充缺失值并分配(:=)相关列的值

library(zoo)
dt[, (num.cols) := na.aggregate(.SD, FUN = median),.SDcols = num.cols]
dt
#   name sex age height
#1:    A   M 1.0  178.1
#2:    B   F 2.0  162.1
#3:    C  NA 3.0  170.9
#4:    D   F 2.5  169.5
#5:    E   M 4.0  172.3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2018-07-28
    • 1970-01-01
    • 2013-04-14
    相关资源
    最近更新 更多