У меня есть dataframe df, который содержит оценки из 2-х сайтов (A & B), 2 группы (group1 & 2) с тремя различными методами (метод1, метод2, метод0):Расчет R в кадре данных с группой управления или базовой линией
df1<-data.frame(site=rep("A", 21),
group=rep("group1", 21),
estimate=c(rnorm(10, 15, 3), rnorm(10, 2, 7), rnorm(1, 6, 2)),
method=c(rep(c("method1","method2"),each=10),"method0"))
df2<-data.frame(site=rep("B", 21),
group=rep("group2", 21),
estimate=c(rnorm(10, 13, 3), rnorm(10, 5, 7), rnorm(1, 9, 2)),
method=c(rep(c("method1","method2"),each=10),"method0"))
df<-rbind(df1, df2)
df
site group estimate method
1 A group1 15.1561073 method1
2 A group1 14.4067422 method1
3 A group1 12.7428921 method1
..........
41 B group2 0.3548033 method2
42 B group2 10.5820482 method0
Я хотел бы использовать method0 в качестве базовой группы и вычислить относительное процентное смещение (РБ) для каждой оценки на каждом участке/группе.
#for each site and group of estimate
rb<-(estimate-estimate0)/estimate0*100%
# where estimate0 is the estimate of method0 of that certain site/group
и ТОЛЬКО ОДНА оценка 0 на каждом сайте/группе. Я пытался написать простую функцию и использовать apply
для каждого сайта/группы, но не получилось.
fun.rb<-function(df, basline){
control<-df$method==baseline
rb<-(df$estimate-control$estimate)/(control$estimate)*100%
return(rb)
}
df %>% group_by(site,group) %>% mutate(rb=fun.rb, baseline="method0")
Любые ввод и комментарии с благодарностью.
Ничего себе, он отлично выглядит. Спасибо за исправление моей функции. – lamushidi
Я должен указать, что вам действительно не нужна эта функция, и вы можете сделать все, что нужно встроить, заменив вызов функции вычислением внутри функции. – yeedle
да, конечно. Это сделает коды еще более аккуратными. Большое спасибо. – lamushidi