【问题标题】:Get data out of "c(\"a\", \"b\")" format获取"c(\"a\", \"b\")"格式的数据
【发布时间】:2018-12-16 08:43:46
【问题描述】:

我有一个字符串"c(\"AV\", \"IM\")",我正在尝试将其转换为字符串"AV IM"

我的问题是我不能 unlist()flatten() 这个,因为它是一个字符,而 paste()stringr::str_c() 都不起作用,因为它在技术上仍然是 1 个字符值。

有什么想法可以做到这一点吗?

如果可能,首选 Tidyverse 解决方案。

编辑:我知道这可以通过正则表达式解决,但我觉得这更像是一个需要解决的字符串级别的“基本”问题,而不是正则表达式问题,如果这有任何意义的话。

【问题讨论】:

  • 你是负责以这种形式获取数据的人(也许使用as.character(substitute(...))?)你最好在上游解决这个问题。
  • 我和你在一起。肯定想早点解决这个问题。问题是我不确定如何。我认为这是一个字符串级别的问题(不是字符级别的,正则表达式有意义)。
  • 输出这个字符串的指令是什么?

标签: r regex dplyr data-cleaning stringr


【解决方案1】:

不确定您是如何到达这里的,但所介绍的这将是一个 eval/parse 情况。但是,正如本网站上的许多其他答案所指出的,几乎总是有一种更好的方法来准备您的数据,因此您最终会以更加 R 友好的形式结束。对于初学者,请参阅What specifically are the dangers of eval(parse(...))?

> a <- "c(\"AV\", \"IM\")"
> (b <- eval(parse(text=a)))
[1] "AV" "IM"
> paste(b, collapse=" ")
[1] "AV IM"

【讨论】:

  • 我认为这正是eval(parse(text 是最干净的解决方案的情况。不干净的是之前对数据做了什么以将其放入此表单。
  • 是的,这正是我的意思,感谢您的澄清,我会编辑。
【解决方案2】:

嗯,你是怎么到这里来的并不容易。您可以使用 eval-parse,尽管它不是矢量化的。而且它也很慢。因此你需要一个正则表达式:

 a <- "c(\"AV\", \"IM\")"
 stringr::str_extract_all(a,"\\w+(?!\\()")
[[1]]
[1] "AV" "IM"

【讨论】:

    【解决方案3】:

    其他答案输出一个向量。我的理解是你想要一个以空格分隔的字符串列表。

    library(dplyr)
    
    a <- "c(\"AV\", \"IM\")"
    
    a %>%
      gsub("c(", "", ., fixed=TRUE) %>% 
      gsub("\"", "", ., fixed=TRUE) %>% 
      gsub(",",  "", ., fixed=TRUE) %>% 
      gsub(")",  "", ., fixed=TRUE)
    

    输出

    "AV IM"
    

    编辑或者简单地说(来自@www的回答):

    a %>%
      gsub("[[:punct:]]|^c",  "", .)
    

    【讨论】:

      【解决方案4】:

      你也可以考虑用正则表达式替换所有符号和开头的c。

      s <- "c(\"AV\", \"IM\")"
      
      s_vec <- strsplit(s, split = ",")[[1]]
      
      gsub("[[:punct:]]|^c", "", s_vec)
      # [1] "AV"  " IM"
      

      【讨论】:

        猜你喜欢
        • 2015-06-12
        • 1970-01-01
        • 2011-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-11
        相关资源
        最近更新 更多