我有一个数据框,其中包含来自蝾螈肠道的各种节肢动物的长度和宽度。因为有些肠道有数千个特定的猎物,我只测量了每种猎物的子集。现在,我想用该猎物的平均长度和宽度替换每个未测量的个体。我想保留数据框,并仅添加填充后的列(length2,width2)。主要原因是每一行也有关于捕捉蝾螈的日期和位置的数据列。我可以使用所测量个体的随机选择来填充NA,但出于论点的目的,让我们假设我只想用平均值替换每个NA。
例如,假设我有一个类似以下内容的数据框:
id taxa length width
101 collembola 2.1 0.9
102 mite 0.9 0.7
103 mite 1.1 0.8
104 collembola NA NA
105 collembola 1.5 0.5
106 mite NA NA
实际上,我有更多的列,大约有25个不同的分类单元,总共约有30,000个猎物。看起来plyr包可能很适合这个问题,但我就是想不出该怎么做。虽然我不算非常熟练的R或编程专家,但我正在努力学习。
虽然我不知道自己在干什么,但如果有帮助,我会尝试创建一个小数据集来练手。
exampleDF <- data.frame(id = seq(1:100), taxa = c(rep("collembola", 50), rep("mite", 25),
rep("ant", 25)), length = c(rnorm(40, 1, 0.5), rep("NA", 10), rnorm(20, 0.8, 0.1), rep("NA",
5), rnorm(20, 2.5, 0.5), rep("NA", 5)), width = c(rnorm(40, 0.5, 0.25), rep("NA", 10),
rnorm(20, 0.3, 0.01), rep("NA", 5), rnorm(20, 1, 0.1), rep("NA", 5)))
以下是我尝试过但未成功的几件事:
# mean imputation to recode NA in length and width with means
(could do random imputation but unnecessary here)
mean.imp <- function(x) {
missing <- is.na(x)
n.missing <-sum(missing)
x.obs <-a[!missing]
imputed <- x
imputed[missing] <- mean(x.obs)
return (imputed)
}
mean.imp(exampleDF[exampleDF$taxa == "collembola", "length"])
n.taxa <- length(unique(exampleDF$taxa))
for(i in 1:n.taxa) {
mean.imp(exampleDF[exampleDF$taxa == unique(exampleDF$taxa[i]), "length"])
} # no way to get back into dataframe in proper places, try plyr?
另一种尝试:
imp.mean <- function(x) {
a <- mean(x, na.rm = TRUE)
return (ifelse (is.na(x) == TRUE , a, x))
} # tried but not sure how to use this in ddply
Diet2 <- ddply(exampleDF, .(taxa), transform, length2 = function(x) {
a <- mean(exampleDF$length, na.rm = TRUE)
return (ifelse (is.na(exampleDF$length) == TRUE , a, exampleDF$length))
})
有什么建议吗?
mi
包也非常不错。Amelia
比mice
或mi
都要快得多,但它确实依赖于您的变量是多元正态分布的。 - richiemorrisroe