如何比较两个字符向量与R中的转义字符?

问题描述:

我有两个列表,我从API获取。我需要比较R中的两个列表来确定哪些项目出现在这两个列表中。我曾希望用intersect()命令来做到这一点,但它不起作用。经过进一步的检查,我注意到每个列表实际上是一个由逗号和转义字符分隔的多个项目组成的单个向量。是否有可能将这些向量转换为多项目列表,以便我可以比较列表?下面是一些示例代码:如何比较两个字符向量与R中的转义字符?

我想什么:

> intersect(x,y) 
[[1]] 
[1] "c" 

我所看到的,而不是:

> intersect(x,y) 
list() 

> as.character(x) 
c(\"a\", \"b\", \"c\") 

> as.character(x) 
c(\"c\", \"d\", \"e\") 

这是怎么回事?我如何比较x和y?有没有办法将这些向量转换为列表,以便我可以使用intersect()命令?

编辑:精致的例子和澄清数据源

+1

你会显示'dput(x)'和'str(x)'的输出吗?我只是好奇,如果'x'真的是一个字符向量开始,或者'as.character'强制字符。 – Aaron

+0

我无法复制你的错误。列表版本基于此代码正常工作。虽然Ryan Runge在答案中指出,你应该使用'c()'而不是'list()' –

+0

这真的是'as.character'的确切输出吗?通常它会以'[1]'开头,并且用引号括起字符串。 – Aaron

我还在猜测在这里,因为你还没有回答我的问题,我看你是越来越输出一样,唯一的办法是,如果xy是第一个实际包含R代码的列表,您可以使用它来创建所需的向量,如下所示。

x <- list('c("a", "b", "c")') 
y <- list('c("c", "d", "e")') 
intersect(x, y) 
## list() 
as.character(x) 
## [1] "c(\"a\", \"b\", \"c\")" 
as.character(y) 
## [1] "c(\"c\", \"d\", \"e\")" 

如果是这样,你需要做的是计算这些表达式,然后你就会有,你认为你有载体。

xx <- eval(parse(text=x[[1]])) 
yy <- eval(parse(text=y[[1]])) 
xx 
## [1] "a" "b" "c" 
yy 
## [1] "c" "d" "e" 
intersect(xx, yy) 

瑞安龙认为,“拥有额外的引号这样可以为数据不同的语言或软件之间共享更经常发生。因此,它可能是API如何被访问的意想不到的效果。” (谢谢!)

但是,这并不适用于您给出的解释。需要更多信息!

感谢您的建议,每个人。我能解决这个问题是这样的:

intersect(as.list(as.character(x[[1]])),as.list(as.character(y[[1]]))) 

我真的不明白为什么把术语[[1]]每个列表名称后解决了问题,但它似乎仍然。

+0

这是没有足够的信息来重现问题;如果你不提供它,我们将会关闭这个问题,因为这对其他人没有帮助。我希望你能提供更多的信息,因为在我仍然好奇的问题中有一些有趣的观点。 – Aaron