Группирование значений в массиве строк, соответствующих критериям в R - PullRequest
2 голосов
/ 09 мая 2020

У меня есть большой фрейм данных df1, в котором есть столбец Student, в котором есть строковые значения для имен студентов, Grades с числовыми c значениями для оценок за экзамен. Другой фрейм данных df2, в котором есть три столбца Class numeri c, From To в качестве диапазона для оценки и Count, который суммирует, сколько учащихся имеет определенную c оценку между некоторым значением для a specifici c class.

Например:

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)

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Не совсем понятно. Вот версия for l oop. Исходя из ожидаемого результата, это может быть «Stundent» из «df1», которое выделяется каждой строке столбца «df2». «Студенты» сравнивают «Оценки» с «от», «с» в «df2» и количество выбранных «Stundent» ограничено значением «Count». Как только выбран «Stundent», он больше не повторяется.

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

В ожидаемом выходном сигнале Джек и «Стюарт для 507» меняются местами. От df1 оценка Джека - 8, а у Стюарта - 4

0 голосов
/ 09 мая 2020

Я предполагаю, что в df1 должен быть еще один столбец, который будет Class, определяющий, какой студент в каком Class, потому что нет информации для сопоставления данных. Если мое предположение неверно, дайте мне знать, и я удалю ответ.

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

Мы можем left_join df1 и df2 на Class и создать значения 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"      
...