【问题标题】:How to split a character vector into data frame?如何将字符向量拆分为数据框?
【发布时间】:2014-04-22 17:56:56
【问题描述】:

我对 R 还是比较陌生,希望您能再次帮助我。我有一个长度为 42000 的字符向量。向量如下所示:

a <- c("blablabla-19960101T000000Z-1.tsv", "blablabla-19960101T000000Z-2.tsv", "blablabla-19960101T000000Z-3.tsv")

我想将向量拆分成如下所示的数据框:

Name        Date          no
blablabla   1996-01-01    1
blablabla   1996-01-01    2
blablabla   1996-01-01    3

我正在努力拆分和创建我的数据框。有人可以帮我弄这个吗?谢谢!

【问题讨论】:

    标签: r vector split dataframe


    【解决方案1】:

    也许有

    library(reshape2)
    colsplit(a, "\\-", names=c("A", "B", "C"))
    
              A                B     C
    1 blablabla 19960101T000000Z 1.tsv
    2 blablabla 19960101T000000Z 2.tsv
    3 blablabla 19960101T000000Z 3.tsv
    

    b <- colsplit(a, "[[:punct:]]|\\T|\\.", names=c("A", "B", "C", "D","E"))
    
              A        B       C D   E
    1 blablabla 19960101 000000Z 1 tsv
    2 blablabla 19960101 000000Z 2 tsv
    3 blablabla 19960101 000000Z 3 tsv
    

    然后

    library(lubridate)
    b$B <- ymd(b$B)
    
              A          B       C D   E
    1 blablabla 1996-01-01 000000Z 1 tsv
    2 blablabla 1996-01-01 000000Z 2 tsv
    3 blablabla 1996-01-01 000000Z 3 tsv
    
    str(b)
    'data.frame':   3 obs. of  5 variables:
     $ A: chr  "blablabla" "blablabla" "blablabla"
     $ B: POSIXct, format: "1996-01-01" "1996-01-01" "1996-01-01"
     $ C: chr  "000000Z" "000000Z" "000000Z"
     $ D: int  1 2 3
     $ E: chr  "tsv" "tsv" "tsv"
    

    【讨论】:

      【解决方案2】:
      DF <- data.frame(do.call(rbind, strsplit(a, "-", fixed=TRUE)))
      DF[,2] <- as.Date(DF[,2] , format="%Y%m%d")
      DF[,3] <- as.integer(gsub(".tsv", "", DF[,3], fixed=TRUE))
      
      #         X1         X2 X3
      #1 blablabla 1996-01-01  1
      #2 blablabla 1996-01-01  2
      #3 blablabla 1996-01-01  3
      

      【讨论】:

        【解决方案3】:

        几乎可以直接使用read.table,但您的日期格式与R 用于colClasses 参数的格式不同。

        没问题。只需指定您自己的 class 并继续 :-)

        ## Create a class called "ymdDate"
        setClass("ymdDate")
        setAs("character", "ymdDate", function(from) as.Date(from, format="%Y%m%d"))
        
        ## Use `read.table` on your character vector. For convenience, I've
        ##   used `gsub` to get rid of the `.tsv` in before reading it in.
        out <- read.table(text = gsub(".tsv$", "", a), header = FALSE, 
                          sep = "-", colClasses=c("character", "ymdDate", "integer"))
        out
        #          V1         V2 V3
        # 1 blablabla 1996-01-01  1
        # 2 blablabla 1996-01-01  2
        # 3 blablabla 1996-01-01  3
        str(out)
        # 'data.frame':  3 obs. of  3 variables:
        #  $ V1: chr  "blablabla" "blablabla" "blablabla"
        #  $ V2: Date, format: "1996-01-01" "1996-01-01" "1996-01-01"
        #  $ V3: int  1 2 3
        

        【讨论】:

          【解决方案4】:

          我知道我参加这个聚会迟到了,但我想在 magrittr 管道中看到同样的想法,并使用更多 tidyverse 函数。这是我得到的:

          library(stringr)
          library(lubridate)
          library(tidyverse)
          
          a <- c("blablabla-19960101T000000Z-1.tsv", "blablabla-19960101T000000Z-2.tsv", "blablabla-19960101T000000Z-3.tsv")
          
          a %>%
          strsplit('-') %>%
          transpose() %>%
          map_dfc(~data_frame(.x)) %>%
          unnest() %>%
          set_names(c('Name','Date','no')) %>% 
          mutate(Date = Date %>%
                  str_extract('\\d+') %>% 
                  ymd(),
                  no = str_extract(no, '\\d+'))
          

          【讨论】:

            猜你喜欢
            • 2014-09-27
            • 1970-01-01
            • 2020-11-08
            • 2020-06-01
            • 1970-01-01
            • 1970-01-01
            • 2014-01-16
            • 1970-01-01
            • 2021-12-29
            相关资源
            最近更新 更多