R 分组数据中的百分比变化:根据组的第一个值计算
我试图得到一组中第一个值(一个变量的)和同一组中每一个值(同一个变量的)之间的百分比变化 示例数据:R 分组数据中的百分比变化:根据组的第一个值计算,r,dplyr,mutate,R,Dplyr,Mutate,我试图得到一组中第一个值(一个变量的)和同一组中每一个值(同一个变量的)之间的百分比变化 示例数据: 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 r
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
我到处寻找,发现了相似的东西,但没有一件是我想要的。谢谢 您想先使用
first()
:
库(tidyverse)
df=data.frame(
组=c(代表('A',4),代表('B',3)),
响应=c(1,4,2,1,1,2,3),
治疗=c(“对照组”、“100mg”、“200mg”、“50mg”、“对照组”、“100mg”、“200mg”)
)
df%>%
分组依据(分组)%>%
变异(
从第一个响应到第二个响应=(响应/第一个(响应)-1)*100
)
#>#tibble:7 x 4
#>#组:组[2]
#>组反应治疗分别从第一组开始
#>
#>1 A 1控件0
#>2 A 4 100mg 300
#>3 A 2 200mg 100
#>4 A 1 50mg 0
#>5b1控制0
#>6B2100mg100
#>7 B 3 200mg 200
由(v0.2.1)于2019-03-20创建的JasonAizkalns回答得很好,但只是为了防止您想保留您的
pct
功能。只要修复pct
函数中的一个小错误,它就可以正常工作
pct <- function(x) {
((x-x[1])/x[1]) * 100
}
> percChange
# A tibble: 7 x 3
# Groups: group [2]
group response treatment
<fct> <dbl> <fct>
1 A 0 control
2 A 300 100mg
3 A 100 200mg
4 A 0 50mg
5 B 0 control
6 B 100 100mg
7 B 200 200mg
pct-perchange
#一个tibble:7x3
#分组:分组[2]
群体反应治疗
1 A 0控件
2 A 300 100mg
3 A 100 200mg
4A050mg
5b0控制
6 B 100毫克
7 B 200毫克
控制治疗是否有必要NA
?或者0
(技术上准确)可以吗?此外,数据是否有序?也就是说,控制
是否总是第一位,或者匹配治疗
值以找到第一个值是否很重要?@divibisan是的-理想情况下,0是最好的!我通常会对数据进行排序,以便在组中首先进行控制。谢谢,谢谢@nsinghs!接受另一个,因为这似乎比我尝试过的更优雅,但我很感激知道我在功能上哪里出了问题谢谢。
pct <- function(x) {
((x-x[1])/x[1]) * 100
}
> percChange
# A tibble: 7 x 3
# Groups: group [2]
group response treatment
<fct> <dbl> <fct>
1 A 0 control
2 A 300 100mg
3 A 100 200mg
4 A 0 50mg
5 B 0 control
6 B 100 100mg
7 B 200 200mg