Преобразуйте первый элемент каждого множителя в NA в R

У меня есть упрощенный фрейм данных:

Day Place   dendrometer max

1   1       1   4684

2   1       1   4831

1   1       2   2486

2   1       2   2596

1   2       1   6987

2   2       1   6824

Мне нужен первый элемент каждого дендрометра как NA, поэтому каждый раз, когда R вычисляет «max» для нового дендрометра (независимо от места), начинается с NA, например:

Day Place   dendrometer max

1   1       1   NA

2   1       1   4831

1   1       2   NA

2   1       2   2596

1   2       1   NA

2   2       1   6824

Не могли бы вы также сообщить мне, что я могу рассчитать СРЕДНЕЕ значение столбца max для каждого дендрометра в каждом кольце (sapply, aggregate?) Вместо расчета среднего значения для всего столбца max? ПРИМЕЧАНИЕ: дендро 1 в месте 1 отличается от дендро 1 в месте 2, мне нужна разная информация для каждого из них.


person fede_luppi    schedule 01.03.2013    source источник
comment
Зачем вам нужны ценности NA? Что такое rings   -  person mnel    schedule 01.03.2013
comment
По сути, вы ничего не написали после того, как мне нужен первый элемент каждого дендрометра, поскольку NA не имеет для меня никакого смысла.   -  person joran    schedule 01.03.2013


Ответы (3)


  library(data.table)
  myDat <- data.table(myDat, key="Day")

  # using the `mult` argument, make the first instance of each Day  NA
  myDat[.(Day), dendrometer := NA, mult="first"]

  # add mean
  myDat[, mean := mean(dendrometer, na.rm=TRUE), by=Day]

  # add max
  myDat[, max := max(dendrometer, na.rm=TRUE), by=Day]

Полученные результаты:

  > myDat
     Day Place dendrometer     mean  max
  1:   1     1          NA 3304.333 4831
  2:   1     1        4831 3304.333 4831
  3:   1     2        2486 3304.333 4831
  4:   1     2        2596 3304.333 4831
  5:   2     1          NA 6824.000 6824
  6:   2     1        6824 6824.000 6824

Использованные образцы данных:

  read.table(text=
  "Day Place   dendrometer
     1       1   4684
     1       1   4831
     1       2   2486
     1       2   2596
     2       1   6987
     2       1   6824", header=TRUE, stringsAsFactors=FALSE) -> myDat
person Ricardo Saporta    schedule 01.03.2013

У вас всегда есть только два измерения одного дендрометра в одном месте? Если да, то вы можете просто установить любое другое значение как NA:

#x is your data.frame
x<-read.table("clipboard",header=TRUE)
x[seq(1,nrow(x),by=2),4]<-NA

а максимальные значения - это значения, отличные от NA.

x[seq(2,nrow(x),by=2),4]

Если ваши данные более сложные, это должно сработать:

dup<-duplicated(x[,2:3]) #find the non-unique cases
x[!dup,4]<-NA #set the first measurements as NA
tapply(x[dup,4],which(dup),max) #compute max from others. 

Обратите внимание, что для вычисления среднего вам не нужно устанавливать первые измерения как NA.

person Jouni Helske    schedule 01.03.2013
comment
Данные намного сложнее, но я понял вашу точку зрения, и вариант вашего примера может сработать. Спасибо! - person fede_luppi; 04.03.2013

Во-первых, средние значения max и должны быть рассчитаны с tapply.

dat <- transform(dat,
                 mean = tapply(max, c(0, cumsum(abs(diff(dendrometer)))), mean))

  Day Place dendrometer  max   mean
1   1     1           1 4684 4757.5
2   2     1           1 4831 2541.0
3   1     1           2 2486 6905.5
4   2     1           2 2596 4757.5
5   1     2           1 6987 2541.0
6   2     2           1 6824 6905.5

Вы можете использовать функцию diff, чтобы найти различия между dendrometer и функцией is.na<-, чтобы заменить значения в max на NA.

is.na(dat$max) <- c(TRUE, diff(dat$dendrometer) != 0)

  Day Place dendrometer  max   mean
1   1     1           1   NA 4757.5
2   2     1           1 4831 2541.0
3   1     1           2   NA 6905.5
4   2     1           2 2596 4757.5
5   1     2           1   NA 2541.0
6   2     2           1 6824 6905.5
person Sven Hohenstein    schedule 01.03.2013
comment
Думаю, это не сработает, если у меня будет более двух дней чтения каждого дендрометра. Это упрощение моего набора данных. В реальном наборе данных есть тысячи дней и сотни показаний в день и дендрометр. - person fede_luppi; 04.03.2013
comment
Нет, нет, ладно, я думаю, вы правы, и это поможет мне решить мою проблему. Спасибо!! - person fede_luppi; 04.03.2013