Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 列表中一定数量的项目_R - Fatal编程技术网

R 列表中一定数量的项目

R 列表中一定数量的项目,r,R,我有这个清单 Mylist <- c("orange", "apple", "cherry") 我试过了,但没有得到正确的结果 df[sapply(strsplit(as.character(df$value), ","), function(x) (x %in% Mylist)) > 0,]; 如果有人告诉我上述代码有什么问题,我将不胜感激 我们可以创建一个模式,方法是粘贴ing“Mylist”的元素,并使用“grep”检查“value”列中是否存在该模式,并基于该模

我有这个清单

Mylist <- c("orange", "apple", "cherry")
我试过了,但没有得到正确的结果

df[sapply(strsplit(as.character(df$value), ","), function(x)  
  (x %in% Mylist)) > 0,]; 

如果有人告诉我上述代码有什么问题,我将不胜感激

我们可以创建一个
模式
,方法是
粘贴
ing“Mylist”的元素,并使用“grep”检查“value”列中是否存在该模式,并基于该模式对数据集对象进行子集划分

df[grepl(paste0("\\b(", paste(tolower(Mylist), collapse="|"), ")\\b"), tolower(df$value)),]
#  id                value
#1  1 orange, peach, apple
#3  3        cherry, peach
如果我们需要基于计数的数据,那么

library(stringr)
df[Reduce(`+`, lapply(Mylist, str_count, string = df$value)) > 1,]
#  id                value
#1  1 orange, peach, apple

您遇到的一个问题是,如果您选中:
strsplit(as.character(df$value),“,”[[1]]
您将看到它返回
#[1]“橙色”“桃色”“苹果色”
请注意桃色和苹果色之前的空格。在不更改代码的情况下,快速修复方法是在
,“
上拆分

第二个问题是df中有
“Cherry”
,但列表中有
“Cherry”
。%在%中,将仅检测精确的字符字符串匹配。如果存在资本化差异的原因,可以使用类似于
tolower()
的函数

第三是
sapply(strsplit(as.character(df$value),“,”),函数(x)(x%在%Mylist中))
返回bools列表,因此它不能被
解释(这是错误消息应该告诉您的),因此您可以更改为
df[lapply(strsplit(as.character(df$value),“,”),fun),sum)>0,]
以最少的代码更改来解决您的问题


前面已经说过,最好退一步,创建一个返回匹配项计数的函数,并将该函数传递给lappy或sappy。

df[sappy(strsplit(as.character(df$value),“,”),function(x)any(tolower(Mylist)%in%x)),]
谢谢,但是为了简单起见,我在这个例子中使用了0。正如我所说,它可以是1,2,…
任何
都可以处理所有情况。它适用于任何>0的情况。谢谢,但为了简单起见,我在本例中使用了0。正如我所说,它可以是1,2,…@MFR抱歉,我没有收到您的评论。让我们假设这是我想要的
(x%in%Mylist)>2
而不是
(x%in%Mylist)>0
谢谢您的指导,我解决了问题。
df[grepl(paste0("\\b(", paste(tolower(Mylist), collapse="|"), ")\\b"), tolower(df$value)),]
#  id                value
#1  1 orange, peach, apple
#3  3        cherry, peach
library(stringr)
df[Reduce(`+`, lapply(Mylist, str_count, string = df$value)) > 1,]
#  id                value
#1  1 orange, peach, apple