我的数据如下所示:
dat <- data.frame(Model = rep(c("OM", "EM-1", "EM-2", "EM-3"), each = 3),
Run = rep(c(1,2,3), time=4),
Value = c(2,10,5,20,26,7,8,15,33,11,31,7))在这个例子中,我有来自多个模型的值,每个模型运行3次。"OM“模型是基本的情况,我想把所有的东西都拿回来比较。
我想,使用tidyverse,计算一个新的值,这将是每个模型运行与其相应的"OM“模型运行之间的差异。我想我已经接近了:
library(tidyverse)
x <- dat %>%
group_by(Run) %>%
filter(!is.na(Value)) %>%
mutate(Diff = c(NA, diff(Value)))计算后续模型运行之间的差异,但我不知道如何使所有这些计算都与"OM“模型相关,而不是之前的模型。我知道我可以通过对我的数据进行细分和这样的计算来做到这一点,但是我正试图用整齐的方式来做,因为随着时间的推移,我会有很多不同的模型,而且我不希望所有的模型都被子集来运行计算。
提前谢谢你的帮助。
发布于 2018-03-08 01:47:17
在按“Run”进行分组后,我们在mutate中将“值”(其中的“模型”)子集为“OM”,并从“OM”中减去“OM”,并在mutate中追加“OM”(对应于“OM”与自身差异的“值”差)。
library(dplyr)
dat %>%
group_by(Run) %>%
mutate(Diff = c(NA, Value[Model!= "OM"] - Value[Model == "OM"]))
# A tibble: 12 x 4
# Groups: Run [3]
# Model Run Value Diff
# <fctr> <dbl> <dbl> <dbl>
# 1 OM 1.00 2.00 NA
# 2 OM 2.00 10.0 NA
# 3 OM 3.00 5.00 NA
# 4 EM-1 1.00 20.0 18.0
# 5 EM-1 2.00 26.0 16.0
# 6 EM-1 3.00 7.00 2.00
# 7 EM-2 1.00 8.00 6.00
# 8 EM-2 2.00 15.0 5.00
# 9 EM-2 3.00 33.0 28.0
#10 EM-3 1.00 11.0 9.00
#11 EM-3 2.00 31.0 21.0
#12 EM-3 3.00 7.00 2.00发布于 2018-03-07 22:18:58
library(tidyverse)
dat %>%
spread(Model, Value) %>%
gather(Model, Value, -Run, -OM) %>%
mutate(Diff = Value - OM)
# Run OM Model Value Diff
#1 1 2 EM-1 20 18
#2 2 10 EM-1 26 16
#3 3 5 EM-1 7 2
#4 1 2 EM-2 8 6
#5 2 10 EM-2 15 5
#6 3 5 EM-2 33 28
#7 1 2 EM-3 11 9
#8 2 10 EM-3 31 21
#9 3 5 EM-3 7 2https://stackoverflow.com/questions/49161709
复制相似问题