将每个因子的第一个元素转换为R中的NA

时间:2013-03-01 03:54:48

标签: r vector dataframe subset na

我的数据框简化如下:

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

我需要每个dendrometer的第一个元素作为NA,因此每次R计算新的dendrometer(独立于地点)的“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

您是否也可以让我知道我可以计算每个环中每个dendrometer的最大列的平均值(sapply,aggregate?)而不是计算整个最大列的平均值? 注意:dendro 1就位1与dendro 1就位2不同,我需要不同的信息为每一个

3 个答案:

答案 0 :(得分:2)

您是否始终只在一个地方测量一个dendrometer?如果是这样,那么您可以将每个其他值设置为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。

答案 1 :(得分:2)

  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

答案 2 :(得分:0)

首先,使用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功能查找dendrometeris.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