サンショウウオの腸からのさまざまな節足動物の長さと幅のデータフレームがあります。一部のガッツには何千もの特定の獲物アイテムがあったため、各獲物の種類のサブセットのみを測定しました. ここで、測定されていない各個体を、その獲物の平均の長さと幅に置き換えたいと思います。データフレームを保持し、代入列 (長さ 2、幅 2) を追加するだけです。主な理由は、各行には、サンショウウオが収集された日付と場所に関するデータを含む列も含まれているためです。測定された個人のランダムな選択で 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))
})
助言がありますか?