【问题标题】:Unpack string and get vector of strings解压字符串并获取字符串向量
【发布时间】:2016-03-16 07:26:14
【问题描述】:

我会在这里解释我的问题。这就是我所拥有的。

单个字符串的列

df <- as.data.frame(c("NI",
        "FA",
        "FI",
        "FST",
        "FA,NI",
        "IA,FI,IO",
        "NI,DI",
        "IA,NI,IO",
        "IA,FT,FI",
        "FA,FT,FI",
        "IA,FST,FI"))

names(df) <- "Column_of_strings"

注意:输出可能不会用引号显示,但它们是字符串。我决定将它们包括在内。

df                   
                         Column_of_strings

                         "NI"
                         "FA"
                         "FI"
                         "FST"
                         "FA,NI"
                         "IA,FI,IO"
                         "NI,DI"
                         "IA,NI,IO"
                         "IA,FT,FI"
                         "FA,FT,FI"
                         "IA,FST,FI"

我想要什么:

                         Column_of_strings

                         "NI"
                         "FA"
                         "FI"
                         "FST"
                         "FA","NI"
                         "IA","FI","IO"
                         "NI","DI"
                         "IA","NI","IO"
                         "IA","FT","FI"
                         "FA","FT","FI"
                         "IA","FST","FI"

如果这些字符串组本身可以存储为向量,那就更好了。

                         Column_of_strings

                         c("NI")
                         c("FA")
                         c("FI")
                         c("FST")
                         c("FA","NI")
                         c("IA","FI","IO")
                         c("NI","DI")
                         c("IA","NI","IO")
                         c("IA","FT","FI")
                         c("FA","FT","FI")
                         c("IA","FST","FI")

总结:

有没有人知道如何:

  1. 最初解压我拥有的字符串列表
  2. 在每个字符串中分配字符串子组,逗号分隔每个所需的字符串。
  3. 理想情况下将子组分配给向量

感谢所有建议!

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以split 使用strsplit 得到listvectors。

    lst <- strsplit(as.character(df[,1]), ',')
    

    如果我们需要在list中做一些操作,我们可以使用lapply/sapply/vapply等循环遍历list元素。例如,

    lapply(lst, table) 
    

    【讨论】:

    • 太棒了,第一个创建的包含字符串子组的向量。非常感谢!
    • 这条评论正上方的数据框并不是我想要的。它将向量中的每个对象拆分,并将它们中的每一个分配到一个单独的列中。不过,cSplit 函数看起来可能对其他一些任务有用。
    • @InfiniteFlashChess 您也可以使用"long" 选项将其转换为“长”格式
    • 看起来 direction = "long" 在只有一个子组的垂直列中将 c(" "IA,FST,FI") 延伸为 "IA", "FST", "FI"每行字符串。(这就是为什么当我尝试你的建议时有 23 个观察值)。我想保留每行中的字符串向量,这是列表很好的做法。非常感谢!这个链接证实了我我在说哈哈stackoverflow.com/questions/11144519/…
    【解决方案2】:

    您可以使用tidyr::separate 将字符串拆分为多列,并在必要时插入NAs:

    library(tidyr)
    df2 <- separate(df, Column_of_strings, c('str1', 'str2', 'str3'), sep = ',', fill = 'right')
    df2
    
    #     str1 str2 str3
    #  1    NI <NA> <NA>
    #  2    FA <NA> <NA>
    #  3    FI <NA> <NA>
    #  4   FST <NA> <NA>
    #  5    FA   NI <NA>
    #  6    IA   FI   IO
    #  7    NI   DI <NA>
    #  8    IA   NI   IO
    #  9    IA   FT   FI
    #  10   FA   FT   FI
    #  11   IA  FST   FI
    

    如果我们创建一个索引列:

    df2 <- cbind(id = seq_along(df2$str1), df2)
    

    ...然后我们可以使用reshape2::melt 将数据放入长格式(有时比列表更有用)并删除NAs,同时将所有位置信息保留在id 和@987654328 @列:

    library(reshape2)
    melt(df2, id = 'id', na.rm = TRUE)
    
    #     id variable value
    #  1   1     str1    NI
    #  2   2     str1    FA
    #  3   3     str1    FI
    #  4   4     str1   FST
    #  5   5     str1    FA
    #  6   6     str1    IA
    #  7   7     str1    NI
    #  8   8     str1    IA
    #  9   9     str1    IA
    #  10 10     str1    FA
    #  11 11     str1    IA
    #  16  5     str2    NI
    #  17  6     str2    FI
    #  18  7     str2    DI
    #  19  8     str2    NI
    #  20  9     str2    FT
    #  21 10     str2    FT
    #  22 11     str2   FST
    #  28  6     str3    IO
    #  30  8     str3    IO
    #  31  9     str3    FI
    #  32 10     str3    FI
    #  33 11     str3    FI
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多