分组数据转换成中的R的范围(Grouping data into ranges in R)

2019-06-27 23:04发布

假设我有R中的数据帧有学生一列,其商标在另一列的名称。 这些标记的范围从20至100。

> mydata  
id  name   marks gender  
1   a1    56     female  
2   a2    37      male  

我想学生分成组的基础上,获得标志的标准划分,使各组标记之间的差异应该大于10。我试图使用的功能表,从而能够从各个范围内的学生人数发言权20-30,30-40,但我想它挑选那些在给定范围内的标记和学生一起把所有的信息在一组。 任何帮助表示赞赏。

Answer 1:

我不知道你的意思“把所有的信息整合在一组”,什么,但这里有一个方法来获得一个清单,dataframes分手了自己的原始数据帧,每个元素都是一个标志内学生的数据帧的10范围:

mydata <- data.frame(
  id = 1:100,
  name = paste0("a",1:100),
  marks = sample(20:100,100,TRUE),
  gender = sample(c("female","male"),100,TRUE))

split(mydata,cut(mydata$marks,seq(20,100,by=10)))


Answer 2:

我认为,@萨沙的回答应该能满足你需要做什么,即使你有一组以上。

您还没有明确地说你想怎么“集团”在你原来的职位数据,并在您的评论,在那里您添加第二个数据集,你还没有明确表示是否打算“合并”这些第一( rbind就足够了,如在评论推荐)。

所以,用的是,这里有几个选项,每个输出不同层次的细节和实用的。 希望其中一个适合您的需求。

首先,这里的一些样本数据。

# Two data.frames (myData1, and myData2)
set.seed(1)
myData1 <- data.frame(id = 1:20, 
                      name = paste("a", 1:20, sep = ""),
                      marks = sample(20:100, 20, replace = TRUE),
                      gender = sample(c("F", "M"), 20, replace = TRUE))
myData2 <- data.frame(id = 1:17,
                      name = paste("b", 1:17, sep = ""),
                      marks = sample(30:100, 17, replace = TRUE),
                      gender = sample(c("F", "M"), 17, replace = TRUE))

其次,不同的选择“分组”。

  • 选项1:返回(在list )从值myData1myData2匹配给定的条件,其。 在这个例子中,你将有两个名单最终data.frame秒。

     lapply(list(myData1 = myData1, myData2 = myData2), function(x) x[x$marks >= 30 & x$marks <= 50, ]) 
  • 选项2:返回(在一个list )每个数据集分成两个,一个用于FALSE (不匹配所述条件),一个用于TRUE (确实匹配陈述的条件)。 换句话说,创建四个组。 在这个例子中,你会用两个列表项目,每个项目有两个嵌套列表结束data.frame秒。

     lapply(list(myData1 = myData1, myData2 = myData2), function(x) split(x, x$marks >= 30 & x$marks <= 50)) 
  • 方案3:比第一个更灵活。 这实质上是@萨沙的例子扩展到列表中。 你可以设置你的休息,无论你想,使这个在我的脑海里,一个非常方便的选择。 在这个例子中,你会用两个列表项目,每个项目有多个嵌套列表结束data.frame秒。

     lapply(list(myData1 = myData1, myData2 = myData2), function(x) split(x, cut(x$marks, breaks = c(0, 30, 50, 75, 100), include.lowest = TRUE))) 
  • 选项4:第一合并数据,并且使用在选项1中描述在这个例子中的分组方法,则最终将与单个data.frame仅含有匹配给定的条件,其值。

     # Combine the data. Assumes all the rownames are the same in both sets myDataALL <- rbind(myData1, myData2) # Extract just the group of scores you're interested in myDataALL[myDataALL$marks >= 30 & myDataALL$marks <= 50, ] 
  • 选项5:使用组合的数据, split数据分成两组:一个相匹配陈述的条件组,其中一个没有。 在这个例子中,你将最终有两个列表data.frame秒。

     split(myDataALL, myDataALL$marks >= 30 & myDataALL$marks <= 50) 

我希望其中一个选项提供您的需求!



Answer 3:

我有同样的问题的种类和堆栈溢出研究一些答案后,我想出了以下解决方案:

步骤1:定义范围步骤2:找到落在范围内第3步中的元素:简介

样品代码,如下所示:

   range = NULL
   for(i in seq(0, max(all$downlink), 2000)){
    range <- c(range, i)
   }
   counts <- numeric(length(range)-1);
   for(i in 1:length(counts)) {
   counts[i] <- length(which(all$downlink>=range[i] & all$downlink<range[i+1]));
   }
   countmax = max(counts)
   a = round(countmax/1000)*1000
   barplot(counts, col= rainbow(16), ylim = c(0,a))


文章来源: Grouping data into ranges in R
标签: r grouping