【问题标题】:Grouping values in a string array matching a criteria in R在匹配 R 中的条件的字符串数组中对值进行分组
【发布时间】:2020-08-24 15:58:13
【问题描述】:

我有一个大数据框 df1 有一个列 Student 有学生姓名的字符串值,Grades 有考试成绩的数值。另一个数据框 df2 包含三列 Class 数字,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),]

我期望得到这样的东西

Students <- c("","Mark, Jhon", "Stuart", "Lillie", "","Carl, Jason", "Stewart", "Jack")
df3 <- data.frame(df2, Students)

【问题讨论】:

  • 你能解释一下df1的学生在哪个班级吗? df1 中的名称列表是否与 df2 完全匹配,因此 df1 中的前两个名称必须在类 101 中(df2 的前 2 行)?
  • 如何匹配 df1df2df1 中不应该有另一列名为Class 吗?

标签: r arrays string dataframe grouping


【解决方案1】:

还不完全清楚。这是for 循环版本。根据预期的输出,通过将“成绩”与“df2”中的“from”、“to”和选择的“学生”的数量受“计数”值的限制。一旦选择了“学生”,就不会再重复了

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

在预期的输出中,Jack 和 'Stewart for 507 交换了。从“df1”开始,杰克的成绩是 8,斯图尔特是 4

【讨论】:

    【解决方案2】:

    我假设df1 中应该有另一列Class 标识哪个学生在哪个Class 中,因为没有与数据匹配的信息。如果我的假设不正确,请告诉我,我将删除答案。

    #adding class column
    df1$Class <- c(101, 101, 201, 201, 308, 308, 507, 507)
    

    我们可以通过Classleft_join df1df2 并创建在范围内的Stundent 的逗号分隔值。

    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"      
    

    【讨论】:

      猜你喜欢
      • 2013-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多