20

サンショウウオの腸からのさまざまな節足動物の長さと幅のデータフレームがあります。一部のガッツには何千もの特定の獲物アイテムがあったため、各獲物の種類のサブセットのみを測定しました. ここで、測定されていない各個体を、その獲物の平均の長さと幅に置き換えたいと思います。データフレームを保持し、代入列 (長さ 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)) 
  })

助言がありますか?

4

5 に答える 5

45

私自身のテクニックではありませんが、しばらく前にボードで見ました。

dat <- read.table(text = "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", header=TRUE)


library(plyr)
impute.mean <- function(x) replace(x, is.na(x), mean(x, na.rm = TRUE))
dat2 <- ddply(dat, ~ taxa, transform, length = impute.mean(length),
     width = impute.mean(width))

dat2[order(dat2$id), ] #plyr orders by group so we have to reorder

ループを使用した非プライヤーアプローチの編集for:

for (i in which(sapply(dat, is.numeric))) {
    for (j in which(is.na(dat[, i]))) {
        dat[j, i] <- mean(dat[dat[, "taxa"] == dat[j, "taxa"], i],  na.rm = TRUE)
    }
}

後で多くの月を編集しますここにdata.table & dplyrアプローチがあります:

データ表

library(data.table)
setDT(dat)

dat[, length := impute.mean(length), by = taxa][,
    width := impute.mean(width), by = taxa]

dplyr

library(dplyr)

dat %>%
    group_by(taxa) %>%
    mutate(
        length = impute.mean(length),
        width = impute.mean(width)  
    )
于 2012-02-17T04:38:15.793 に答える
3

これに答える前に、私は R の初心者だと言いたいです。したがって、私の答えが間違っていると思われる場合はお知らせください。

コード:

DF[is.na(DF$length), "length"] <- mean(na.omit(telecom_original_1$length))

幅にも同じように適用します。

DF は、data.frame の名前を表します。

ありがとう、パルティ

于 2015-09-02T14:10:14.590 に答える
1

@Tyler Rinkerのソリューションを拡張すると、帰属featuresする列があるとします。この場合features <- c('length', 'width')。次にdata.table、ソリューションを使用すると次のようになります。

library(data.table)
setDT(dat)

dat[, (features) := lapply(.SD, impute.mean), by = taxa, .SDcols = features]
于 2017-01-07T03:59:27.337 に答える