对于R中的多个单独案例,计算单个案例中两个观察值之间的差异

时间:2017-09-16 20:09:48

标签: r subtraction

我有一个类似于以下的数据集。

Case <- c("A", "B", "C", "A", "B", "C", "A", "B", "C")
ObservationNumber <- c(1, 1, 1, 2, 2, 2, 3, 3, 3)
ObservedValue <- c(154, 152, 157, 173, 176, 171, 203, 205, 199)

我正在尝试创建一个新数据框,其中一列是Case(A,B或C),第二列是从第一次观察到第三次观察的观测值的变化。行数将是不同情况的数量(上例中为3,但真实数据集中为数百)。

有一些解决方法可以用于示例数据,但我的真实数据是几百个案例,每个案例有50个观察值。因此,我需要一些方法来做到这一点,不需要(1)为每个案例创建一个单独的数据集(例如通过过滤)来执行减法,这是我能够想出的唯一方法。自己的。

有没有人对如何做到这一点有任何其他想法?

**同样在示例中,行按顺序排列,但在实际数据集中却不是。因此,我不能只采取每组中的第一行和最后一行;我需要在每个组中获取具有最大值和最小值的行。以下两个答案都很好地解决了这个问题。

2 个答案:

答案 0 :(得分:4)

我喜欢将dplyr库用于这些分组/总结问题:

library(dplyr)
df %>% 
    arrange(ObservationNumber) %>%
    group_by(Case) %>% 
    summarise(diff = last(ObservedValue) - first(ObservedValue))

答案 1 :(得分:2)

  Case Diff
1    A  -49
2    B  -53
3    C  -42
Case              <- c(rep("A",50), rep("B",50),rep("C",50))
ObservationNumber <- rep(seq(1,50),3)
ObservedValue     <- runif(150)

mydat <- as.data.frame(cbind(Case, ObservationNumber, ObservedValue),stringsAsFactors = F)
mydat$ObservedValue <- as.numeric(mydat$ObservedValue)

result <- data.frame()
for(c in unique(mydat$Case)){
  result <- rbind(result, data.frame(Case=c,Diff=  
                                       mydat$ObservedValue[mydat$Case==c & mydat$ObservationNumber == min(mydat$ObservationNumber)] - 
                                       mydat$ObservedValue[mydat$Case==c & mydat$ObservationNumber == max(mydat$ObservationNumber)]
  ))
}

我还做了一个更大的数据集来确保它仍然很快,它是:

Case              <- c(rep("A",500), rep("B",500),rep("C",500), rep("D",500))
ObservationNumber <- rep(seq(1,500),4)
ObservedValue     <- runif(2000)

mydat <- as.data.frame(cbind(Case, ObservationNumber, ObservedValue),stringsAsFactors = F)
mydat$ObservedValue <- as.numeric(mydat$ObservedValue)

result <- data.frame()
for(c in unique(mydat$Case)){
  result <- rbind(result, data.frame(Case=c,Diff=  
                                       mydat$ObservedValue[mydat$Case==c & mydat$ObservationNumber == min(mydat$ObservationNumber)] - 
                                       mydat$ObservedValue[mydat$Case==c & mydat$ObservationNumber == max(mydat$ObservationNumber)]
  ))
}

...并且只是100%肯定,我再次将其扩展到4个案例,每个案例500个(2000行),它仍然在不到1秒的时间内完成:

{{1}}