[英]Grouping data into ranges in R
假设我在R中有一个数据框,其中一列中的学生名称和另一列中的标记。 这些标记从20到100不等。
> mydata
id name marks gender
1 a1 56 female
2 a2 37 male
我想根据获得的标记的标准将学生分成小组,这样每组中的标记之间的差异应该大于10.我试着使用功能表,它给出了每个范围内的学生数量。 20-30,30-40,但我希望它选择那些在给定范围内有标记并将所有信息放在一起的学生。 任何帮助表示赞赏。
我不确定你的意思是“将所有信息放在一个组中”,但这里有一种方法可以获得一个列表,其中包含原始数据框的数据框,其中每个元素都是一个标记内学生的数据框范围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)))
我认为@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))
第二,“分组”的不同选择。
选项1 :返回(在list
) myData1
和myData2
中与给定条件匹配的值。 对于此示例,您最终将得到两个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 :比第一个更灵活。 这基本上是@Sacha的例子扩展到列表。 您可以在任何地方设置休息时间,在我看来,这是一个非常方便的选择。 对于此示例,您最终会得到一个嵌套列表,其中包含两个列表项,每个列表项都包含多个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
包含与给定条件匹配的值的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)
我希望其中一个选项满足您的需求!
我有同样的问题,在研究了堆栈溢出的一些答案后,我想出了以下解决方案:
步骤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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.