【问题标题】:How can I compare two character vectors with escape characters in R?如何将两个字符向量与 R 中的转义字符进行比较?
【发布时间】:2017-09-03 02:48:25
【问题描述】:

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

我想要什么:

 > 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() 命令?

编辑:改进的示例和澄清的数据源

【问题讨论】:

  • 你会显示dput(x)str(x) 的输出吗?我只是好奇x 是否真的是一个字符向量,或者as.character 是否将其强制转换为字符。
  • 我无法复制您的错误。列表版本基于此代码运行良好。尽管正如 Ryan Runge 在答案中指出的那样,您应该使用 c() 而不是 list()
  • 这真的是as.character 的确切输出吗?通常它会以[1] 开头并在引号中包含字符串。
  • 您没有在您的问题或下面的答案中提供足够的信息来重现问题;如果您不提供,我们将关闭问题,因为它对其他人没有帮助。我希望你能提供更多,因为问题中有一些我仍然很好奇的有趣点。

标签: r list escaping set-intersection


【解决方案1】:

我仍然在这里猜测,因为你还没有回答我的问题,但我看到你得到这样的输出的唯一方法是如果 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)

Ryan Runge 建议“随着数据在不同语言或软件之间共享,这样的额外引号可能会更频繁地发生。因此,这可能是 API 访问方式的意外影响。” (谢谢!)

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

【讨论】:

    【解决方案2】:

    谢谢大家的建议。我能够像这样解决这个问题:

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

    我真的不明白为什么在每个列表名称后加上术语 [[1]] 可以解决问题,但似乎仍然如此。

    【讨论】:

    • 信息不足以重现问题;如果您不提供,我们将关闭问题,因为它对其他人没有帮助。我希望你能提供更多,因为问题中有一些我仍然很好奇的有趣点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多