将数据分组到R中的范围

Mad*_*ddy 6 grouping r

假设我在R中有一个数据框,其中一列中的学生名称和另一列中的标记.这些标记从20到100不等.

> mydata  
id  name   marks gender  
1   a1    56     female  
2   a2    37      male  
Run Code Online (Sandbox Code Playgroud)

我想根据获得的标记的标准将学生分成小组,这样每组中的标记之间的差异应该大于10.我试着使用功能表,它给出每个范围内的学生数量来自20-30,30-40,但我希望它选择那些在给定范围内有标记并将所有信息放在一起的学生.任何帮助表示赞赏.

Sac*_*amp 9

我不确定你的意思是"将所有信息放在一个组中",但这里有一种方法可以获得一个列表,其中包含原始数据框的数据框,其中每个元素都是一个标记内学生的数据框范围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)))
Run Code Online (Sandbox Code Playgroud)


A5C*_*2T1 5

我认为@Sacha的答案应该足以满足您的需要,即使您有多个设置也是如此。

您尚未明确表示要如何将原始帖子中的数据“分组”,并且在注释中添加了第二个数据集的地方,尚未明确说明是否计划先“合并”这些数据(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))
Run Code Online (Sandbox Code Playgroud)

第二,“分组”的不同选项。

  • 选项1:返回(在list)从所述的值myData1myData2其匹配给定的条件。在此示例中,您将得到两个data.frameS 的列表。

    lapply(list(myData1 = myData1, myData2 = myData2), 
           function(x) x[x$marks >= 30 & x$marks <= 50, ])
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项2:(在中list)将每个数据集分成两部分,一个用于FALSE(不符合指定条件),另一个用于TRUE(不符合指定条件)。换句话说,创建四个组。在此示例中,您将得到一个带有两个列表项的嵌套列表,每个列表项都有两个data.frames。

    lapply(list(myData1 = myData1, myData2 = myData2), 
           function(x) split(x, x$marks >= 30 & x$marks <= 50))
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项3:比第一种更灵活。这实际上是@Sacha的示例扩展到列表。您可以随时随地设定休息时间,在我看来,这是一个非常方便的选择。在此示例中,您将得到一个嵌套列表,其中包含两个列表项,每个列表项均带有多个data.frames。

    lapply(list(myData1 = myData1, myData2 = myData2),
           function(x) split(x, cut(x$marks, 
                                    breaks = c(0, 30, 50, 75, 100), 
                                    include.lowest = TRUE)))
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项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, ]
    
    Run Code Online (Sandbox Code Playgroud)
  • 选项5:使用合并的数据,split将数据分为两组:一组符合所述条件,另一组不符合。对于此示例,您将得到一个带有两个data.frames 的列表。

    split(myDataALL, myDataALL$marks >= 30 & myDataALL$marks <= 50)
    
    Run Code Online (Sandbox Code Playgroud)

我希望这些选项之一能满足您的需求!