对字符串数组中与R中的条件匹配的值进行分组
我有一个大数据框对字符串数组中与R中的条件匹配的值进行分组,r,arrays,string,dataframe,grouping,R,Arrays,String,Dataframe,Grouping,我有一个大数据框df1,它有一个列Student,其中学生姓名有字符串值,Grades,考试成绩有数字值。另一个数据框df2,它有三列Classnumeric,FromTo作为分数范围和Count,总结了有多少学生在某个特定班级的某个值之间有特定分数 例如: Stundent <- c("Mark", "Jhon", "Stuart", "Lillie", "Carl", "Jason", "Stewart","Jack") Grades <- c(7,9,1,6,7,6,4,8)
df1
,它有一个列Student
,其中学生姓名有字符串值,Grades
,考试成绩有数字值。另一个数据框df2
,它有三列Class
numeric,From
To
作为分数范围和Count
,总结了有多少学生在某个特定班级的某个值之间有特定分数
例如:
Stundent <- c("Mark", "Jhon", "Stuart", "Lillie", "Carl", "Jason", "Stewart","Jack")
Grades <- c(7,9,1,6,7,6,4,8)
df1 <- data.frame(Stundent,Grades)
Class <- c(101, 101, 201, 308, 507, 201, 507, 308)
from <- c(1,6,1,1,6,6,1,6)
to <- c(5,10,5,5,10,10,5,10)
Count <- c(0,2,1,0,1,1,1,2)
df2 <- data.frame(Class,from,to,Count)
df2 <- df2[order(df2$Class),]
Stundent还不完全清楚。这是循环版本的。根据预期输出,“df1”中的“Stundent”可能是通过比较“df2”中的“Grades”与“from”、“to”来分配给“df2”中“Stundent”列的每一行,并且选择的“Stundent”的数量受“Count”值的限制。选择“特技凹痕”后,不会再次重复
tmpdat <- df1
tmpdat$Stundent <- as.character(tmpdat$Stundent)
df2$Students <- ""
for(i in seq_len(nrow(df2))) {
if(df2$Count[i] >0 ) {
st1 <- head(tmpdat$Stundent[tmpdat$Grades >= df2$from[i] &
tmpdat$Grades <= df2$to[i]], df2$Count[i])
tmpdat <- tmpdat[!tmpdat$Stundent %in% st1, ]
df2$Students[i] <- toString(st1)
}
}
df2
# Class from to Count Students
#1 101 1 5 0
#2 101 6 10 2 Mark, Jhon
#3 201 1 5 1 Stuart
#6 201 6 10 1 Lillie
#4 308 1 5 0
#8 308 6 10 2 Carl, Jason
#5 507 6 10 1 Jack
#7 507 1 5 1 Stewart
tmpdat我假设在df1
中应该有另一列Class
来识别哪个学生在哪个Class
中,因为没有与数据匹配的信息。如果我的假设不正确,请告诉我,我将删除答案
#adding class column
df1$Class <- c(101, 101, 201, 201, 308, 308, 507, 507)
你能澄清一下df1的学生在哪个班吗?df1
中的名称列表是否与df2
完全匹配,因此df1
中的前两个名称必须在类101中(df2
的前两行)?如何匹配df1
和df2
?在df1
中不应该有另一列名为Class
?
#adding class column
df1$Class <- c(101, 101, 201, 201, 308, 308, 507, 507)
library(dplyr)
df1 %>%
left_join(df2, by = 'Class') %>%
group_by(Class, from, to) %>%
summarise(Stundent = toString(Stundent[Grades >= from & Grades <= to]))
# Class from to Stundent
# <dbl> <dbl> <dbl> <chr>
#1 101 1 5 ""
#2 101 6 10 "Mark, Jhon"
#3 201 1 5 "Stuart"
#4 201 6 10 "Lillie"
#5 308 1 5 ""
#6 308 6 10 "Carl, Jason"
#7 507 1 5 "Stewart"
#8 507 6 10 "Jack"