要评估仅包含列名的列,我们可以使用get()
.我们需要lapply()
在多个列上执行此操作.
## determine the column names that contain NA values nm <- names(dat)[colSums(is.na(dat)) != 0] ## replace with the mean - by 'id' dat[, (nm) := lapply(nm, function(x) { x <- get(x) x[is.na(x)] <- mean(x, na.rm = TRUE) x }), by = id]
这给了更新 dat
id var1 var2 var3 1: 1 1.666667 4.000000 4 2: 1 1.000000 4.000000 4 3: 1 2.000000 4.000000 4 4: 1 2.000000 4.000000 3 5: 2 1.000000 5.000000 5 6: 2 1.000000 5.000000 5 7: 2 2.000000 4.666667 5 8: 2 2.000000 4.000000 4
更新:使用您更新的问题,为避免在包含NA的所有列上运行此问题,请不要使用nm
.只需使用自己的矢量tomean
.
tomean <- c("var1", "var2") dat[, (tomean) := lapply(tomean, function(x) { x <- get(x) x[is.na(x)] <- mean(x, na.rm = TRUE) x }), by = id]
这给了
id var1 var2 var3 1: 1 1.666667 4.000000 4 2: 1 1.000000 4.000000 4 3: 1 2.000000 4.000000 4 4: 1 2.000000 4.000000 NA 5: 2 1.000000 5.000000 5 6: 2 1.000000 5.000000 5 7: 2 2.000000 4.666667 5 8: 2 2.000000 4.000000 4