Определение наличия строк в определенном порядке - PullRequest
2 голосов
/ 17 июня 2019

Я бы хотел посчитать, сколько раз мои ученики могли указать 5 конкретных слов И подмножество / фильтр для ответов учеников, в которых слова были в правильном порядке.Правильный порядок = зеленый, желтый, оранжевый, красный, черный.Все данные приведены в нижнем регистре и не имеют пунктуации:

#     Student responses
Id    Data$Colors
1     green yellow orange red black
2     yellow green orange red black
3     red violet pink black
4     purple green orange red black
5     blue pink yellow scarlet   

Вывод, к которому я стремлюсь:

#   Student responses
Id  Data$Colors                                Data$Count   Data$CorrOrder
1   green yellow orange red black              5            TRUE
2   yellow green orange red blacks             4            FALSE
3   red violet pink black                      2            TRUE
4   purple green orange red black              4            TRUE
5   blue pink yellow brown                     1            NA
6   green yellow orange red very red black     4*           TRUE

-1 точка для повторения.Я смог получить столбец подсчета, выполнив это

Data <- c("\\bgreen\\b", "\\byellow\\b", "\\borange\\b", "\\bred\\b", "\\bblack\\b")

Data$Count<- str_count(Data$Colors, paste(Data, collapse = '|'))

Однако это не вычитает повторяющиеся правильные цвета, такие как Id 6.

Кто-нибудь знает, как я могу сгенерировать Data$CorrOrder * * 1013

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Используя tidyverse, мы можем получить Count и CorrOrder отдельно. Чтобы получить Count, мы сначала разбиваем Colors на пробелы и создаем separate_rows для каждого цвета, чтобы было легко сравнивать значения. Затем мы подсчитываем, сколько из unique Colors присутствует в каждом Id из общего числа all_colors, и, поскольку мы хотим дать -1 для каждого повторного значения, мы вычитаем его из числа значений duplicated в каждом Группа дает нам общий балл.

all_colors <- c("green", "yellow", "orange", "red", "black")
library(tidyverse)

df1 <- df %>%
      left_join(df %>%
                 separate_rows(Colors, sep = "\\s+") %>%
                 group_by(Id) %>%
                 summarise(count = max(sum(all_colors %in% unique(Colors)) - 
                                   sum(duplicated(Colors)), 0)))

Чтобы получить правильный порядок, мы снова разделяем цвета на разные строки, сохраняем только цвета из all_colors, удаляем дубликаты и проверяем, всегда ли возрастает порядок появления цветов, и присваиваем логическое значение TRUE / FALSE соответственно. ,

df1 %>%
   left_join(df1 %>%
              separate_rows(Colors, sep = "\\s+") %>%
              group_by(Id) %>%
              filter(Colors %in% all_colors & !duplicated(Colors)) %>%
              summarise(new = if (n() == 1) NA 
              else all(diff(na.omit(match(Colors, all_colors))) > 0)))

#  Id                                 Colors CorOrder Count
#1  1          green yellow orange red black     TRUE     5
#2  2         yellow green orange red blacks    FALSE     4
#3  3                  red violet pink black     TRUE     2
#4  4          purple green orange red black     TRUE     4
#5  5                 blue pink yellow brown       NA     1
#6  6 green yellow orange red very red black     TRUE     4
1 голос
/ 19 июня 2019

Для начала, если вы рассматриваете значения как фактор ordered, вы можете проверить, отсортированы ли они без сортировки, используя is.unsorted:

colorder <- c("green", "yellow", "orange", "red", "black")

spl <- lapply(strsplit(dat$Colors, "\\s+"), ordered, levels=colorder)
cnt <- sapply(spl, function(x) length(unique(na.omit(x))) - sum(tabulate(x) > 1) )
cnt
#[1] 5 4 2 4 1 4
out <- !sapply(spl, is.unsorted, na.rm=TRUE)
out[cnt == 1] <- NA
out
#[1]  TRUE FALSE  TRUE  TRUE    NA  TRUE
...