如何在R中构建一个函数,将变量拆分为区间,并计算区间的平均值、sd和计数

如何在R中构建一个函数,将变量拆分为区间,并计算区间的平均值、sd和计数,r,function,R,Function,我尝试将年龄变量拆分为区间,计算区间的平均值、sd和计数,然后将每个区间的输出保存在一个向量中,然后将这些向量组合到一个数据帧中,在这个数据帧中,我可以简单地获取每个区间的值 我已经做到了: intervals <- function(g){ i1 <- c() i2 <- c() i3 <- c() i4 <- c() i5 <- c() if(g <= 30){ i1 <- c(mean(g), sd(g))

我尝试将年龄变量拆分为区间,计算区间的平均值、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)
}
我甚至还没有尝试将计数包括在内,因为我没有机会制定解决方案


非常感谢你的帮助

这不是一个函数,但它实现了您想要的:

# 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()
  )

这不是一个函数,但它实现了您想要的:

# 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()
  )
使用以下方法进行尝试:

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


使用以下方法进行尝试:

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



或者,删除所有case_when和mutate,并使用像group_bycategory=cutage,c0,30,40,50,60,Inf,labels=paste0i,1:5这样的剪切,这是一个有用的提示。谢谢你!非常感谢你的帮助!当我将您的代码应用于我的数据(数据框的一列)时。我的代码只得到总样本的值,而不是按组得到的值。平均sd 45.22727 13.11818计数函数似乎也有问题。错误:n应该只在数据上下文中调用,因为plyr以某种方式阻止了dplyr,所以I不起作用。卸载后,您的解决方案将完美运行!谢天谢地,删除所有的case_when和mutate,使用像group_bycategory=cutage,c0,30,40,50,60,Inf,labels=paste0i,1:5这样的剪切,这是一个有用的提示。谢谢你!非常感谢你的帮助!当我将您的代码应用于我的数据(数据框的一列)时。我的代码只得到总样本的值,而不是按组得到的值。平均sd 45.22727 13.11818计数函数似乎也有问题。错误:n应该只在数据上下文中调用,因为plyr以某种方式阻止了dplyr,所以I不起作用。卸载后,您的解决方案将完美运行!谢谢你的帮助。不幸的是,我得到了这个错误:namesres@Justus Blachke中的错误已修复-它需要levelscategories。此外,我还使用正则表达式对其进行了重新格式化。@Justus Blaschke在R中,自动生成的类别的格式为30,40]——但是正则表达式捕捉到了数字并将其转换为:30它也可以完美地处理我的数据!非常感谢。我现在要试着了解你做了什么:谢谢你的帮助。不幸的是,我得到了这个错误:namesres@Justus Blachke中的错误已修复-它需要levelscategories。此外,我还使用正则表达式对其进行了重新格式化。@Justus Blaschke在R中,自动生成的类别的格式为30,40]——但是正则表达式捕捉到了数字并将其转换为:30它也可以完美地处理我的数据!非常感谢。我现在试着理解你做了什么:D