r - 检测字符串是否按特定顺序出现

标签 r string count stringr detect

我想计算我的学生说出 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吗?

最佳答案

首先,如果您将值视为有序因子,则可以使用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

关于r - 检测字符串是否按特定顺序出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56625826/

相关文章:

c++ - 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2)- C++ 编译器问题

python - 如何更好地计算另一个列表中列表的出现次数,然后使用计数列出每个元素的结果

c++ - 如何在 C++ 中从字符串中快速查找和子字符串化多个项目?

c++ - 我的字符串比较在 Cpp 中不起作用

mySQL 删除带有 count(*) GROUP 和 HAVING 的行

r - 如何计算R中每一行的字符串频率

r - 如何更改 R Shiny 应用程序中图标的颜色?

r - 如何在ggplot2绘图区域上获得一种以上的背景颜色?

r - 函数列表 : Apply additional argument only to those functions who can take it

string - 格式化 Go 字符串而不打印?