#r
#r
Вопрос:
У меня проблема с вычислением SD в моем фрейме данных в R. Мне нужно вычислить SD для каждого столбца с помощью step=3
. Итак, SD на km 1:3
, SD на km 4:6
, …
Я уже пробовал разные решения, но, к сожалению, безуспешно:
df <- data.frame(km = c(1:13),
A2012 = c(0.1,0.3,0.8,0.45,0.98,0.45,0.75,0.71,0.36,0.11,0.26,0.68,0.41),
A2013 = c(0.36,0.11,0.26,0.68,0.41,0.45,0.1,0.3,0.8,0.98,0.45,0.75,0.71))
Ответ №1:
Это достижимо путем сокращения фрейма данных на диапазоны, а затем разделения:
df$ranges <- cut(df$km,seq(1,13,3),include.lowest=T,right=F)
###new solution, much nicer
SDs <- aggregate(df[,2:3],list(df$ranges),sd)
### old solution
SDs <- t(sapply(split(df,df$ranges),function(df){
apply(df[,2:3],2,sd)
}))
###solution to question in comment:
cuts <- matrix(data=c(seq(1,max(df$km)-3,2),seq(4,max(df$km),2)),ncol=2)
SDs <- t(sapply(1:nrow(cuts),function(rn)
{
SD <- apply(subset(df,df$km >= cuts[rn,1] amp; df$km <= cuts[rn,2])[,2:3],2,sd)
return(SD)
}))
rownames(SDs) <- apply(cuts,1,paste,collapse = "-")
colnames(SDs) <- paste0("sd(",colnames(SDs),")")
SDs
sd(A2012) sd(A2013)
1-4 0.2954516 0.2412986
3-6 0.2644491 0.1737815
5-8 0.2171597 0.1567376
7-10 0.3039051 0.4132392
9-12 0.2412986 0.2200757
Комментарии:
1. Я отредактировал более приятное решение. Мое старое решение работает так же, но менее лаконично.
2. Возможно ли создать скользящий SD-файл Windows? Так, например, чтобы составить SD на КМ 1: 4, затем сделать SD на КМ 2: 6 для второго и т.д..
3. Да, в принципе, это возможно. Просто чтобы проверить, должен ли измениться размер вашего окна? Поскольку
1:4
меньше, чем2:6
4. Это моя вина, извините. это не Windows 2: 6, а 3: 6
5. Это идеально! я пытался использовать функции «конечные точки» и «rolling_sd», но они специфичны для временных окон. Большое тебе спасибо, Джулиан.