我的数据看起来像这样:
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))
我在多个运行中有多个模型的值,在这种情况下,每个运行4个模型的4个模型。 &#34; OM&#34;模型是基本情况,我想比较一切。
我想,使用tidyverse,计算一个新值,它将是每个模型运行与其相应的&#34; OM&#34;之间的差异。模型运行。我想我正在接近:
library(tidyverse)
x <- dat %>%
group_by(Run) %>%
filter(!is.na(Value)) %>%
mutate(Diff = c(NA, diff(Value)))
计算后续模型的运行之间的差异,但我无法弄清楚如何使所有这些计算与&#34; OM&#34;模型,而不仅仅是以前的模型。我知道我可以通过对我的数据进行子集化并以这种方式进行计算来实现这一目标,但是我试图在tidyverse中干净利落地做到这一点,因为随着时间的推移我将拥有许多不同的模型,并且不希望必须对所有这些模型进行子集化运行计算。
提前感谢您的帮助。
答案 0 :(得分:2)
按照&#39;运行&#39;进行分组后,我们对&#39;值&#39;进行了分组。其中&#39;模型&#39;不是&#39; OM&#39;并在NA
中减去mutate
的附加内容({&#39;对应于&#39; OM&#39;与自身差异的差异)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
1}}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>@ViewData["Title"] - Heatmap</title>
<base href="~/" />
<link rel="stylesheet" href="~/css/leaflet.css" />
<script src="~/scripts/leaflet.js"></script>
<script src="~/scripts/heatmap.js"></script>
<script src="~/scripts/leaflet-heatmap.js"></script>
<link rel="stylesheet" href="~/dist/vendor.css" asp-append-version="true" />
</head>
答案 1 :(得分:1)
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 2