【发布时间】:2019-08-11 13:09:49
【问题描述】:
我正在尝试获取组中的第一个值(一个变量的)与同一组中的每个其他值(同一变量的)之间的百分比变化。
示例数据:
df = data.frame(group = c(rep('A',4), rep('B',3)),
response = c(1,4,2,1,1,2,3),
treatment = c("control","100mg","200mg","50mg","control","100mg","200mg"))
> df
group response treatment
A 1 control
A 4 100mg
A 2 200mg
A 1 50mg
B 1 control
B 2 100mg
B 3 200mg
换句话说,我想得到百分比变化 响应相对于同一组中所有其他治疗水平的治疗“对照”。 治疗的级别数可能因组而异。
到目前为止我所拥有的:
# function for % change
pct <- function(x) {(x/lag(x)-1)*100}
library(dplyr)
# group data and apply function
percChange <- df %>%
group_by(group) %>%
mutate_at(vars(response), funs(pct))
# the output (perChange) is:
# group response treatment
# 1 A NA control
# 2 A 300 100mg
# 3 A -50 200mg
# 4 A -50 50mg
# 5 B NA control
# 6 B 100 100mg
# 7 B 50 200mg
但我想要的输出是:
# group response treatment
# 1 A NA control
# 2 A 300 100mg
# 3 A 100 200mg
# 4 A 0 50mg
# 5 B NA control
# 6 B 100 100mg
# 7 B 200 200mg
我到处寻找,发现了类似的东西,但没有一个是我所追求的。谢谢。
【问题讨论】:
-
对照处理具有
NA是否重要?或者0(技术上准确)好吗?另外,数据是否有序?也就是说,control是否总是第一个,或者匹配treatment值以找到第一个值很重要? -
@divibisan 是的,你是对的——最好是 0!我通常对数据进行排序,因此控制将是组中的第一位。谢谢。