我有一个类似于以下的数据集。
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)为每个案例创建一个单独的数据集(例如通过过滤)来执行减法,这是我能够想出的唯一方法。自己的。
有没有人对如何做到这一点有任何其他想法?
**同样在示例中,行按顺序排列,但在实际数据集中却不是。因此,我不能只采取每组中的第一行和最后一行;我需要在每个组中获取具有最大值和最小值的行。以下两个答案都很好地解决了这个问题。
答案 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}}