【问题标题】:Convert first element of each factor to NA in R将每个因子的第一个元素转换为 R 中的 NA
【发布时间】:2013-02-15 12:16:11
【问题描述】:

我有一个简化如下的数据框:

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 的 max 列的 MEAN(sapply,聚合?),而不是计算整个 max 列的平均值? 注意: dendro 1 in place 1 与 dendro 1 in place 2 不同,我需要为它们每个提供不同的信息

【问题讨论】:

  • 您为什么需要 NA 值?什么是rings
  • 基本上你在“我需要每个 dendrometer 的第一个元素作为 NA”之后写的任何内容对我来说都没有任何意义。

标签: r vector dataframe subset na


【解决方案1】:

首先用tapply计算max的平均值。

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&lt;- 函数将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

【讨论】:

  • 我认为当我有超过两天的时间为每个树木测量仪读数时,这将行不通。这是我的数据集的简化。真实的数据集每天有数千天和数百个读数和 dendrometer。
  • 不不好吧,我认为你是对的,这将帮助我解决我的问题。谢谢!!
【解决方案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

【讨论】:

    【解决方案3】:

    您是否总是在一个地方对一台测树仪进行两次测量?如果是这样,那么您可以将所有其他值设置为 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。

    【讨论】:

    • 数据要复杂得多,但我明白了你的意思,你的例子的变体可能会起作用。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    • 2013-10-07
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多