在R中将矢量元素解析为字符串

时间:2018-06-15 22:48:20

标签: r string vector

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

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

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”这样的功能吗?这会对我有所帮助。提前谢谢,抱歉天真的问题。

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:4)

如果没有引号,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 :(得分:2)

我不确定你是否可以这样做,因为R将寻找无法找到的对象AAA。但是为什么不只是在整个事情上加上引号然后将矢量分成&#34;,&#34;?

gfx_vreg_corner: ldo@0185f000 {
    compatible = "qcom,msm8953-gfx-ldo";
    reg = <0x0185f000 0x30>, <0xa4000 0x1000>;
    reg-names = "ldo_addr", "efuse_addr";

    regulator-name = "msm_gfx_ldo";
    regulator-min-microvolt = <1>;
    regulator-max-microvolt = <7>;

    qcom,ldo-voltage-ceiling = <620000 680000 750000>;
    qcom,ldo-voltage-floor =   <510000 510000 600000>;

    qcom,num-corners = <7>;
    qcom,num-ldo-corners = <3>;
    qcom,ldo-enable-corner-map = <1 1 1 0 0 0 0>;
    qcom,init-corner = <4>;

    vdd-cx-supply = <&pm8953_s2_level>;
    qcom,vdd-cx-corner-map = <RPM_SMD_REGULATOR_LEVEL_LOW_SVS>,
                <RPM_SMD_REGULATOR_LEVEL_LOW_SVS>,
                <RPM_SMD_REGULATOR_LEVEL_SVS>,
                <RPM_SMD_REGULATOR_LEVEL_SVS_PLUS>,
                <RPM_SMD_REGULATOR_LEVEL_NOM>,
                <RPM_SMD_REGULATOR_LEVEL_NOM_PLUS>,
                <RPM_SMD_REGULATOR_LEVEL_TURBO>;

    mem-acc-supply = <&gfx_mem_acc>;
    qcom,mem-acc-corner-map = <1 1 1 2 2 2 2>;
    qcom,ldo-init-voltage-adjustment = <35000 25000 0>;

答案 3 :(得分:2)

当一个人学习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
>

答案 4 :(得分:1)

如果您将对象作为长度为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"