首页 > 解决方案 > 将一列重新排列为两列数据框 r

问题描述

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

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、子字符串和其他一些代码来实现这一点。但是,我最终丢失了很多数据。关于如何解决这个问题并保留所有数据的任何想法?我知道这是一个经常被问到的问题,但这个数据集比我见过的任何其他数据都更混乱。

标签: rdplyrtidyverse

解决方案


两种解决方案:

str_extract这是使用from package的两步解决方案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

推荐阅读