r - 过滤r中同一列中的多个字符串

标签 r string filter subset

我的大型数据集(Groceries)有一列包含字符数据(Fruits),所有这些数据都是小写的,并且所有这些数据都不包含标点符号。

它看起来有点像这样:

# Groceries Data Frame
Id    Groceries$Fruits
1     apple orange banana lemon grapefruit
2     grapes tomato passion fruit
3     strawberry orange kiwi
4     lemon orange passion fruit grapefruit lime
5     lemon orange passion fruit grapefruit lime peach
  ...

我正在尝试从“水果”列中选择包含 5 种特定水果(橙子、酸橙、柠檬、葡萄柚和百香果)的所有行(其中有 3,320 行)。最初,我只对包含所有 5 个水果的行感兴趣,没有其他水果。因此,这 5 行中唯一应该被过滤/子集化的行是第 4 行。水果不必按任何特定顺序排列。

数据实际上是测试的答案,所以最终我感兴趣的是确定谁得到了 0/5 个水果,谁得到了 1/5、2/5 等等......

目前我已经尝试了2种方法,均无效。 首先,我尝试使用 grep(),但结果数据框中没有存储任何行。

# 1st attempt with grep()
Correct fruits <- Groceries[grep("orange, lemon, lime, passion fruit, 
grapefruit", Groceries$Fruits), ]

然后我尝试使用 filter(),但所选行不只包含我要查找的 5 个水果,它会选择包含 5 个水果中任何一个的所有行。

# 2nd attempt with filter
library(dplyr)
library(stringr)
CorrectFruits <- c("lemon", "orange", "passion fruit", "grapefruit", 
"lime")

filter <- Groceries %>%
  select(Id, Fruits) %>%
  filter(str_detect(tolower(Fruits), pattern = CorrectFruits))

我最初追求的结果是一个新的 DF,其中包含 Groceries 表中的所有列,但仅包含正确选择所有 5 个水果的人的行。

接下来,选择相反的选项会很酷;所有未答对全部 5 题的人。

最后,我希望能够对那些正确的特定比例的人进行子集化。 IE。第 1 行正确 3 个,第 2 行仅正确 1 个,第 3 行仅正确 1 个。

任何帮助将不胜感激!

以下是一些列的示例:

# Groceries
Id   Age      Nationality    Colour question   Fruits question
1    26-35    Canadian       Red               apple orange banana lemon grapefruit
2    26-35    US             Blue              grapes tomato passion fruit
3    46-55    Canadian       Red               strawberry orange kiwi
4    55+      US             Red               lemon orange passion fruit grapefruit lime
5    36-45    British        Green             lemon orange passion fruit grapefruit lime peach

最佳答案

可能需要更多地说明您打算如何处理包含所有 5 个水果和一些额外水果的答案,但这应该可以帮助您。我用“passionfruit”替换了“passionfruit”的所有实例,以使其更容易:

df$Fruits <- gsub("passion fruit", "passionfruit", df$Fruits)
CorrectFruits <- c("lemon", "orange", "passionfruit", "grapefruit", 
                   "lime")
df$Count <- str_count(df$Fruits, paste(CorrectFruits, collapse = '|'))
df$Count <- ifelse((df$Count == 5 & str_count(df$Fruits, '\\w+') > 5), 0, df$Count)

这给出了

ID                                          Fruits Count
1            apple orange banana lemon grapefruit     3
2                      grapes tomato passionfruit     1
3                          strawberry orange kiwi     1
4       lemon orange passionfruit grapefruit lime     5
5 lemon orange passionfruit grapefruit lime peach     0

第一行进行西番莲果替换,然后 str_count 计算 df$Fruit 中所有正确水果的出现次数。最后,如果所有 5 个水果都正确,但还有多余的水果,则 Count 重置为 0。

关于r - 过滤r中同一列中的多个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56503659/

相关文章:

r - 使用纵向数据集计算随时间变化的百分比

r - 更改堆叠 ggplot 图例中的几何顺序

java - 使用 Java 字符串替换方法产生与预期不同的结果,为什么?

python - 你如何将前两个字母大写

string - 要求文件为字符串

R中的RDF整数

使用 R & data.table 或 HIVE 将\\N 替换为 NA

css - 尝试从正则表达式结果中删除十六进制代码

ios - Eureka MultipleSelectorRow

jquery - 允许用户创建 MySQL 过滤器时转义危险代码