我想绘制一个水平小平面线与该方面的总体中位数.
我尝试了这种方法,但没有使用以下代码创建虚拟汇总表:
require(ggplot2)
dt = data.frame(gr = rep(1:2, each = 500),
id = rep(1:5, 2, each = 100),
y = c(rnorm(500, mean = 0, sd = 1), rnorm(500, mean = 1, sd = 2)))
ggplot(dt, aes(x = as.factor(id), y = y)) +
geom_boxplot() +
facet_wrap(~ gr) +
geom_hline(aes(yintercept = median(y), group = gr), colour = 'red')
Run Code Online (Sandbox Code Playgroud)
过去,建议使用解决方案
geom_line(stat = "hline", yintercept = "median")
Run Code Online (Sandbox Code Playgroud)
但它已经停止(产生错误"没有名为StatHline的统计数据").
另一个解决方案建
geom_errorbar(aes(ymax=..y.., ymin=..y.., y = mean))
Run Code Online (Sandbox Code Playgroud)
但它产生了
Error in data.frame(y = function …Run Code Online (Sandbox Code Playgroud) 我正在使用smean.cl.normalHmisc包中的一个函数,该函数返回一个包含3个值的向量:均值和低位和高位CI.当我在data.table2组使用它时,我获得2列和6行.有没有办法获得结果,两行对应2组,每个函数的输出分别列,即均值和CI?
require(Hmisc)
require(data.table)
dt = data.table(x = rnorm(100),
gr = rep(c('A', 'B'), each = 50))
dt[, lapply(.SD, smean.cl.normal), by = gr, .SDcols = "x"]
Run Code Online (Sandbox Code Playgroud)
输出:
gr x
1: A -0.07916335
2: A -0.33656667
3: A 0.17823998
4: B -0.02745333
5: B -0.32950607
6: B 0.27459941
Run Code Online (Sandbox Code Playgroud)
所需的输出:
gr Mean Lower Upper
1: A -0.07916335 -0.33656667 0.17823998
2: B -0.02745333 -0.32950607 0.27459941
Run Code Online (Sandbox Code Playgroud) 我有以下工作Mathematica代码:
ODENInit[n_, xIni_] :=
Join[{x[1][0] == xIni}, Table[x[i][0] == 0, {i, 2, n}]]
ODEN[n_] :=
Join[{x[1]'[t] == k1 - k2 x[1][t]},
Table[x[i]'[t] == k1 x[i - 1][t] - k2 x[i][t], {i, 2, n}]]
ODENVars[n_] := Table[x[i][t], {i, 1, n}];
Manipulate[
Module[{sol},
sol = NDSolve[
Join[ODEN[10], ODENInit[10, 0]] /. {k1 -> mk1, k2 -> mk2},
ODENVars[10], {t, 0, 10}];
Plot[Evaluate@Table[x[i][t] /. sol, {i, 1, 10}], {t, 0, 10}]],
{{mk1, 1}, 0.1, 10, .1}, {{mk2, 1}, 0.1, 10, .1}]
Run Code Online (Sandbox Code Playgroud)
有没有办法重写Manipulate部分,这样我就不需要将k1和k2参数重新分配给虚拟参数,这里是mk1和mk2?感谢任何提前提示.
在下面的数据表中,我想id从列中选择具有唯一且最小值的行pos2:
dt = data.table(id = c(1,2,2,3,3,3),
pos1 = c(0.1, 0.2, 0.2, 0.3, 0.3, 0.3),
pos2 = c(0.1, 0.25, 0.21, 0.34, 0.31, 0.32))
id pos1 pos2
1: 1 0.1 0.10
2: 2 0.2 0.25
3: 2 0.2 0.21
4: 3 0.3 0.34
5: 3 0.3 0.31
6: 3 0.3 0.32
Run Code Online (Sandbox Code Playgroud)
我现在做的方式是创建一个中间表:
dt.red = dt[, .(pos2 = first(sort(pos2))), by = id]
id pos2
1: 1 0.10
2: 2 0.21
3: 3 0.31
Run Code Online (Sandbox Code Playgroud)
然后,我合并以获得所需的最终结果:
merge(dt, dt.red)
id …Run Code Online (Sandbox Code Playgroud)