【问题标题】:Rearrange one column into a two column data frame r将一列重新排列成两列数据框 r
【发布时间】:2020-05-03 12:45:28
【问题描述】:

我有一个大文件,以一种非常不方便的方式组织,所有值在一列中,每个单元格有七个值,最后两行除外,如下所示:

df <- c('(98440=9) (98450=9) (98500=9) (98520=9) (98530=9) (98540=9) (98550=9)',
'(98555=9) (98560=9) (98570=9) (98590=9) (98600=9) (98620=9) (98630=9)',
'(98690=9) (98920=3) (98930=5) (98940=5) (98950=9) (98990=11) (99900=-1)',
'(99910=11) (99920=-1) (99930=11)',
'(-1=-1) (-2=-1) (99999=-1)')

我只想保留数值,同时将第一个和第二个数值分成两列,其中'='是分隔符,如:

      x     y
  <dbl> <dbl>
1 98440     9
2 98450     9
3 98500     9

我管理两个使用单独的 dplyr、子字符串和其他一些代码来实现这一点。但是,我最终丢失了很多数据。关于如何解决这个问题并保留所有数据的任何想法?我知道这是一个经常被问到的问题,但这个数据集比我见过的任何其他数据集都要混乱。

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

    两种解决方案:

    这是使用 str_extract 包 stringr 的两步解决方案。

    第一步 - 将价值链拆分为单个值:

    df1 <- unlist(strsplit(df, " "))
    

    第二步 - 拆分 = 处的值并将值的一半分配给新数据帧的两列:

    df2 <- data.frame(
      col1 = str_extract(df1, "(-)?\\d+(?==)"),
      col2 = str_extract(df1, "(?<==)(-)?\\d+")
    )
    

    或者,这是使用str_extract_all 的一步解决方案:

    df1 <- data.frame(
      col1 = unlist(str_extract_all(df, "(-)?\\d+(?==)")),
      col2 = unlist(str_extract_all(df, "(?<==)(-)?\\d+"))
    )
    

    编辑:

    如果数据是数据帧的一部分,待拆分的数据称为Var1,则代码如下:

    df1 <- data.frame(
      col1 = unlist(str_extract_all(df$Var1, "(-)?\\d+(?==)")),
      col2 = unlist(str_extract_all(df$Var1, "(?<==)(-)?\\d+"))
    )
    

    结果:

    df2
        col1 col2
    1  98440    9
    2  98450    9
    3  98500    9
    4  98520    9
    5  98530    9
    6  98540    9
    7  98550    9
    8  98555    9
    9  98560    9
    10 98570    9
    11 98590    9
    12 98600    9
    13 98620    9
    14 98630    9
    15 98690    9
    16 98920    3
    17 98930    5
    18 98940    5
    19 98950    9
    20 98990   11
    21 99900   -1
    22 99910   11
    23 99920   -1
    24 99930   11
    25    -1   -1
    26    -2   -1
    27 99999   -1
    

    【讨论】:

    • 对不起,我忘了提到数据是在数据框中组织的。如果在值之后添加 df
    【解决方案2】:

    经典地,使用gsub 和strsplit。

    df <- 
      data.frame(matrix(as.double(unlist(strsplit(gsub("[\\(\\)]", "", v), "=|\\s"))),,2, b=T))
    
    #       V1 V2
    # 1  98440  9
    # 2  98450  9
    # 3  98500  9
    # 4  98520  9
    # 5  98530  9
    # 6  98540  9
    # 7  98550  9
    # 8  98555  9
    # 9  98560  9
    # 10 98570  9
    # 11 98590  9
    # 12 98600  9
    # 13 98620  9
    # 14 98630  9
    # 15 98690  9
    # 16 98920  3
    # 17 98930  5
    # 18 98940  5
    # 19 98950  9
    # 20 98990 11
    # 21 99900 -1
    # 22 99910 11
    # 23 99920 -1
    # 24 99930 11
    # 25    -1 -1
    # 26    -2 -1
    # 27 99999 -1
    

    数据

    v <- c("(98440=9) (98450=9) (98500=9) (98520=9) (98530=9) (98540=9) (98550=9)", 
    "(98555=9) (98560=9) (98570=9) (98590=9) (98600=9) (98620=9) (98630=9)", 
    "(98690=9) (98920=3) (98930=5) (98940=5) (98950=9) (98990=11) (99900=-1)", 
    "(99910=11) (99920=-1) (99930=11)", "(-1=-1) (-2=-1) (99999=-1)"
    )
    

    【讨论】:

      【解决方案3】:

      tidyverse 的设计初衷就是为了不方便地排列杂乱无章的数据!

      library(tidyverse)
      
      c('(98440=9) (98450=9) (98500=9) (98520=9) (98530=9) (98540=9) (98550=9)',
        '(98555=9) (98560=9) (98570=9) (98590=9) (98600=9) (98620=9) (98630=9)',
        '(98690=9) (98920=3) (98930=5) (98940=5) (98950=9) (98990=11) (99900=-1)',
        '(99910=11) (99920=-1) (99930=11)',
        '(-1=-1) (-2=-1) (99999=-1)') %>%
      
        purrr::map(~ str_split(.," ")) %>% # split each string into its individual components
      
        unlist() %>%
      
        tibble::enframe(NULL,"Numbers") %>%
      
        dplyr::mutate(Numbers = str_replace_all(Numbers,"[()]","")) %>% # remove the brackets as they are unnecessary
      
        tidyr::separate(Numbers,c("Number 1","Number 2"),sep = "=") # separate using "=" as the separator
      

      如果您在第一步中将数据帧而不是字符向量传递给它,则相同的代码可以工作。

      【讨论】:

        猜你喜欢
        • 2013-10-21
        • 1970-01-01
        • 2013-07-03
        • 2012-10-01
        • 1970-01-01
        • 2015-09-25
        • 2018-11-27
        • 1970-01-01
        相关资源
        最近更新 更多