Как построить функцию в R, которая разбивает переменные на интервалы и вычисляет среднее значение, sd и число для интервалов - PullRequest
1 голос
/ 24 января 2020

Я пытаюсь разбить переменную Age на интервалы, вычислить среднее значение, sd и число для интервалов, затем сохранить выходные данные для каждого интервала в векторе и затем объединить эти векторы в кадр данных, где для каждого интервала я могу просто взять значения.

Я сделал это:

intervals <- function(g){
  i1 <- c()
  i2 <- c()
  i3 <- c()
  i4 <- c()
  i5 <- c()
  if(g <= 30){
    i1 <- c(mean(g), sd(g))
    df <- cbind(i1)
  }else if(g > 30 & g <= 40){
      i2 <- c(mean(g), sd(g))
      df <- cbind(i2)
  }else if(g > 40 & g <= 50){
      i3 <- c(mean(g), sd(g))
      df <- cbind(i3)
  }else if(i >50 & i <= 60){
      i4 <- c(mean(g), sd(g))
      df <- cbind(i4)
  }else if(g > 60){
      i5 <- c(mean(g), sd(g))
      df <- cbind(i5)
  }else{
 } 
return(df)
}

Вот что я получаю из своего кода:

           i3
[1,] 45.22727
[2,] 13.11818

Я даже не пытался включить счетчик потому что у меня не было возможности найти решение.

Большое спасибо за вашу помощь!

Ответы [ 2 ]

4 голосов
/ 24 января 2020

Это не функция, но она достигает того, что вы хотите:

# sample data
df <- data.frame(
  age = runif(100, min = 10, max = 100)
)


# trying to first define the categories and then calculate the descriptive statistics
# edit: I used @thelatemail suggestion from the comments to simplify the code
df %>%
  group_by(category = cut(age, c(0,30,40,50,60,Inf), labels=paste0("i",1:5))) %>%
  summarise(
    mean = mean(age),
    sd = sd(age),
    count = n()
  )
2 голосов
/ 24 января 2020
intervals <- function(ages, 
                      interval_limits=c(0, 30, 40, 50, 60, Inf),
                      labels = NULL) {
    as.data.frame(lapply(split(ages, 
                               cut(ages, interval_limits)), 
                         function(vec) c(mean = mean(vec),
                                         sd = sd(vec),
                                         count = length(vec))))
}

попробуйте, используя:

set.seed(1)
df <- data.frame(
  age = runif(100, min = 10, max = 100)
)
intervals(df$age)

# output:
        X.0.30.  X.30.40.  X.40.50.  X.50.60. X.60.Inf.
mean  21.094326 35.094549 44.625106 54.240979 79.692913
sd     5.930636  3.175697  2.913968  2.613085  9.707679
count 17.000000 10.000000 16.000000 12.000000 45.000000


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...