Расчет среднего и межквартильного диапазона «вырезанных» данных для построения графика - PullRequest
2 голосов
/ 24 июня 2019

Извинения Я новичок в R, у меня есть набор данных с высотой и плотностью кроны деревьев, например:

i_h100   i_cd
2.89     0.0198
2.88     0.0198
17.53    0.658
27.23    0.347

Я хочу перегруппировать 'h_100' в 2-метровые интервалы от 2 до 30 м максимумЗатем я хочу вычислить среднее значение i_cd и межквартильный диапазон для каждого из этих интервалов, чтобы затем я мог построить их с регрессией наименьших квадратов.Что-то не так с кодом, который я использую, чтобы получить среднее значение.Это то, что я имею до сих пор:

mydata=read.csv("irelandish.csv")
height=mydata$i_h100
breaks=seq(2,30,by=2)  #2m intervals
height.cut=cut(height, breaks, right=TRUE)

#attempt at calculating means per group
install.packages("dplyr")
mean=summarise(group_by(cut(height, breaks, right=TRUE), 
mean(mydata$i_cd)))
install.packages("reshape2")
dcast(mean)

Заранее спасибо за любой совет.

Ответы [ 2 ]

2 голосов
/ 24 июня 2019

Использование aggregate() для вычисления средних значений.

# Some example data
set.seed(1)

i_h100 <- round(runif(100, 2, 30), 2)
i_cd <- rexp(100, 1/i_h100)
mydata <- data.frame(i_cd, i_h100)

# Grouping i_h100
mydata$i_h100_2m <- cut(mydata$i_h100, seq(2, 30, by=2))
head(mydata)
#        i_cd i_h100 i_h100_2m
# 1  2.918093   9.43    (8,10]
# 2 13.735728  12.42   (12,14]
# 3 13.966347  18.04   (18,20]
# 4  2.459760  27.43   (26,28]
# 5  8.477551   7.65     (6,8]
# 6  6.713224  27.15   (26,28]

# Calculate groupwise means of i_cd
i_cd_2m_mean <- aggregate(i_cd ~ i_h100_2m, mydata, mean)

# And IQR
i_cd_2m_iqr <- aggregate(i_cd ~ i_h100_2m, mydata, IQR)

upper <- i_cd_2m_mean[,2]+(i_cd_2m_iqr[,2]/2)
lower <- i_cd_2m_mean[,2]-(i_cd_2m_iqr[,2]/2)

# Plotting the result
plot.default(i_cd_2m_mean, xaxt="n", ylim=range(c(upper, lower)),
  main="Groupwise means \U00B1 0.5 IQR", type="n")
points(upper, pch=2, col="lightblue", lwd=1.5)
points(lower, pch=6, col="pink", lwd=1.5)
points(i_cd_2m_mean, pch=16)

axis(1, i_cd_2m[,1], as.character(i_cd_2m[,1]), cex.axis=0.6, las=2)

enter image description here

1 голос
/ 24 июня 2019

Вот решение,

library(reshape2)
library(dplyr)
mydata <- data_frame(i_h100=c(2.89,2.88,17.53,27.23),i_cd=c(0.0198,0.0198,0.658,0.347))
     height <- mydata$i_h100
breaks  <- seq(2,30,by=2)  #2m intervals
height.cut <- cut(height, breaks, right=TRUE)

mydata$height.cut <- height.cut

mean_i_h100 <- mydata %>% group_by(height.cut) %>% summarise(mean_i_h100 = mean(i_h100))

Несколько замечаний:

  • лучше избегать именования переменных с именами функций, поэтому я изменил переменную mean наmean_i_h100
  • Я использую обозначение канала, что делает код более читабельным, избегая повторения первого аргумента каждой функции, вы можете найти более подробное объяснение здесь .Без обозначения канала последняя строка кода будет выглядеть следующим образом: mean_i_h100 <- summarise(group_by(mydata,height.cut),mean_i_h100 = mean(i_h100))
  • вам нужно загрузить два пакета, которые вы установили с помощью library
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...