按因子列对数据框组进行变量插补

3

我有一个数据框,其中包含数值列,这些列具有我想要通过因子水平来填充缺失值的因子水平...让我解释一下。

part   id   value
a      1     23.4
a      2     23.8
a      3     45.6
a      4     34.7
a      5     Na
b      1     45.2
b      2     34.6
b      3     Na
b      4     30.9
b      5     28.1

我希望用部分的平均值来填补NA值。所以对于a部分,我想用a部分1-4id的平均值来填补5 id的缺失值,对于b部分同样,用b部分其他id的平均值来填补3 id的缺失值等。

我需要在许多列中执行此操作(想象一下有更多的值列)。因此可能需要使用apply和函数等方法。


你可以通过在read.table/read.csv中使用na.strings='Na'来避免将数字列读取为因子。 - akrun
另外,考虑使用missForest包。 - zx8754
1个回答

2

通过在 read.table/read.csv 中使用 na.strings 参数,我们可以将缺失值转换为真正的 NA,从而将“value”列读取为“numeric”。使用 dplyr,我们可以将多个值列中的 NAs 替换为该列的 mean

library(dplyr)
df1 %>%
    group_by(part) %>%
    mutate_each(funs(replace(., which(is.na(.)), mean(., na.rm=TRUE))), 
       starts_with('value'))

或者使用 data.table 的类似选项。

library(data.table)
nm1 <- grep('value', names(df1))
setDT(df1)[, (nm1) := lapply(.SD,  function(x) replace(x,
     which(is.na(x)), mean(x, na.rm=TRUE))), by = part,.SDcols=nm1]

数据

df1 <- read.table(text="part   id   value
a      1     23.4
a      2     23.8
a      3     45.6
a      4     34.7
a      5     Na
b      1     45.2
b      2     34.6
b      3     Na
b      4     30.9
b      5     28.1", header=TRUE, na.strings="Na", stringsAsFactors=FALSE)

谢谢您的提问。如果值列(有很多列)具有不同的名称,该如何处理呢?例如:col3=value,但是col4=nextvalue,col5=adiffvalue等等... - PaulBeales
@PaulBeales 这不是问题。您可以删除 starts_with 并使用 col3:col5 或在 ?select 中描述的某些方法来选择列。 - akrun
@PaulBeales 我认为列名称应该是 col3col4 等等。在你的情况下,应该是 contains('value') 或者 ends_with('value') - akrun
1
谢谢...这就是我需要的...非常感谢 - 已打勾..! - PaulBeales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接