【问题标题】:Parse vector elements as string in R将向量元素解析为R中的字符串
【发布时间】:2018-06-15 22:48:20
【问题描述】:

我知道这很简单,但我找不到直接的解决方案。

如何告诉解释器在不使用引号的情况下将向量内容读取为字符串? 示例:

vector<-c("AAA", "BBB", "CCC", "DDD", "EEE", "FFF", "GGG", "HHH")
vector
[1] "AAA" "BBB" "CCC" "DDD" "EEE" "FFF" "GGG" "HHH"

如果我想构建相同的对象怎么办:

vector<-c(AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH)
Error: object 'AAA' not found

我们有像“to.character”之类的函数吗?这对我有很大帮助。在此先感谢,对于幼稚的问题,我们深表歉意。

【问题讨论】:

  • 另一种可能考虑的方法是使用span。例如,scan(textConnection("AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH"), what="", sep=",") 或排除 sep 参数(如果它们以空格分隔)。
  • @Imo 我认为您的建议很好,为什么不将其作为@SeGa 建议的扩展答案呢?谢谢!

标签: r string vector


【解决方案1】:

如果没有引号,AAA 等将被解释为名称,并将寻找具有此名称的对象。因此,您将需要非标准评估(使用“原样”参数,无需评估——substitute 返回未评估的表达式,deparse 将其转换为字符串),类似于

c__ <- function(...) sapply(substitute(list(...)),deparse)[-1]
vec <-c__(AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH)
vec 
# [1] "AAA" "BBB" "CCC" "DDD" "EEE" "FFF" "GGG" "HHH"

【讨论】:

  • 正是我想要的。这是天才,非常感谢!
【解决方案2】:

你并没有试图强迫任何东西来塑造这里的角色。您试图输入一个字符串文字而不告诉 R 它是一个字符串文字。您可以使用as.character() 将另一种向量强制转换为字符向量,例如as.character(1:10),但您无法做任何事情来让R 将AAA 解释为"AAA"。如果您告诉使用AAA 而不是"AAA",解释器将始终查找名为AAA 的对象。

【讨论】:

  • 感谢您的澄清!.. 我会尽力做到最好。
【解决方案3】:

我不确定你是否可以这样做,因为 R 会寻找找不到的对象 AAA。但是为什么不直接在整个内容周围加上引号,然后用“,”分割向量呢?

vector<-"AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH"

vec <- strsplit(vector, ",")[[1]]

str(vec)
 chr [1:8] "AAA" " BBB" " CCC" " DDD" " EEE" " FFF" " GGG" " HHH"

【讨论】:

    【解决方案4】:

    在学习 R 时,考虑向量和数据框之间的关系很重要。数据帧可以被认为是给定长度的相关向量的集合。因此,使用 Base R 解决此问题的另一种方法是使用其中一个文件读取函数(例如 read.table())并从结果数据表中提取向量。

    请注意,不是在一行中列出数据元素,而是必须在不同的行中输入它们。

    aString <- "AAA 
    BBB 
    CCC 
    DDD 
    EEE 
    FFF 
    GGG 
    HHH"
    # use text argument to read the aString object as if it is an external file
    aVector <- read.table(text=aString,stringsAsFactors=FALSE)$V1
    aVector
    

    ...和输出:

    > aVector
    [1] "AAA" "BBB" "CCC" "DDD" "EEE" "FFF" "GGG" "HHH"
    >
    

    这种技术使人们能够按行输入数据,并将其读入数据框。

    # example with multiple vectors per row
    
    aString ="
    var1 var2
    var1 var2
    var1 var2"
    
    read.table(text=aString,stringsAsFactors=FALSE)
    

    ...和输出:

    > read.table(text=aString,stringsAsFactors=FALSE)
        V1   V2
    1 var1 var2
    2 var1 var2
    3 var1 var2
    >
    

    【讨论】:

    • 对于我想要自动化的其他东西看起来真的很有用。很好的方法,非常感谢!
    【解决方案5】:

    如果您将对象作为长度为 1 的字符向量,即

    x <- "AAA, BBB, CCC, DDD, EEE, FFF, GGG, HHH"
    

    然后您可以使用scan 将其解析为字符向量。

    myVec <- scan(textConnection(x), what="", sep=",")
    

    由于scan 通常需要一个外部文件,您可以使用textConnection 构建可以即时运行的内容。连接的内部工作对我来说仍然有点模糊,但在通过分块处理大文件时它们会非常有用。有关连接的更多详细信息,请参阅 ?textConnection?file

    这将返回您想要的结果。

    myVec
    [1] "AAA"  " BBB" " CCC" " DDD" " EEE" " FFF" " GGG" " HHH"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-06
      • 1970-01-01
      • 2012-12-08
      相关资源
      最近更新 更多