【问题标题】:How to convert several characters to vectors in R?如何将多个字符转换为 R 中的向量?
【发布时间】:2018-12-05 10:55:45
【问题描述】:

我正在努力将几个字符转换为向量并将它们作为 R 中的列表。

转换规则如下:

  1. 为每个字符分配一个数字。前任。 A=1, B=2, C=3,...
  2. 当字符长度为“>=2”时创建一个向量。前任。 AB = c(1,2), ABC = c(1,2,3)
  3. 制作包含多个向量的列表。

例如,假设有一个ex 对象,它包含三个组件。对于每个组件,我想让它列出对象list1list2list3

ex = c("(A,B,C,D)", "(AB,BC,CD)","(AB,C)")

# 3 lists to be returned from ex object
list1 = "list(1,2,3,4)"                # from (A,B,C,D)
list2 = "list(c(1,2), c(2,3), c(3,4))" # from (AB,BC,CD)
list3 = "list(c(1,2), c(3))"           # from (AB,C)

请告诉我一个很好的 R 函数来解决上面的例子。 * 反映了微小的变化。

【问题讨论】:

    标签: r list vector character


    【解决方案1】:
    lookUpTable = as.numeric(1:4)        #map numbers to their respective strings
    names(lookUpTable) = LETTERS[1:4]
    
    step1<-                              #get rid of parentheses and split by ",".
    strsplit(gsub("[()]", "", ex), ",")
    
    result<-                             #split again to make things like "AB" into "A", "B", also convert the strings to numbers acc. to lookUpTable
    lapply(step1, function(x){ lapply(strsplit(x, ""), function(u) unname(lookUpTable[u])) })
    
    # assign to the global environment.
    invisible(
    lapply(seq_along(result), function(x) {assign(paste0("list", x), result[[x]], envir = globalenv()); NULL})
    )
    
    # get it as strings:
    invisible(
        lapply(seq_along(result), function(x) {assign(paste0("list_string", x), capture.output(dput(result[[x]])), envir = globalenv()); NULL})
    )
    

    数据:

    ex = c("(A,B,C,D)", "(AB,BC,CD)","(AB,C)")
    

    提示和技巧:

    • 我在gsub(和strsplit)中使用了正则表达式。学习正则表达式!

    • 我创建了一个lookUpTable,将各个字符串映射到数字。确保您的 lookUpTable 设置类似。

    • 查看应用函数,例如 ?lapply

    • 最后我assign 将结果发送到全球环境。我不推荐这一步,但它是您要求的。

    【讨论】:

    • 感谢您的热心回复!!!但是,我尝试了您建议的所有步骤,但最后一步有点不同,因为 list1、list2 和 list3 是“嵌套列表”形式。此外,我需要展平每个嵌套列表并将它们组合成“c()”形式。你能按照我的建议帮我做一个最终表格吗?
    • 使用您的输入数据ex,我的解决方案给出了除了类型int 而不是num 完全相同的结果。不确定您的问题出在哪里。
    • 啊,我明白你的意思了。结构形式一模一样!我误以为最终形式的类型是list。但我需要制作一个character object,例如list1="list(1,2,3,4)"list2="list(c(1,2), c(2,3), c(3,4))"。很抱歉误导你...
    • @EunjiLee,我更新了我的解决方案。这是我能得到的最接近的。请注意,我对lookUpTable(as.numeric)做了一点改动。
    • 这太完美了!!非常感谢:)
    猜你喜欢
    • 2021-07-24
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多