r - 将一列重新排列为两列数据框 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、子字符串和其他一些代码来实现这一点。但是,我最终丢失了很多数据。关于如何解决这个问题并保留所有数据的任何想法?我知道这是一个经常被问到的问题,但这个数据集比我见过的任何其他数据都更混乱。
解决方案
两种解决方案:
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
推荐阅读
- javascript - Watson Assistant 上下文未更新
- python - Numpy 错误:这是在尝试安装 Numpy 时运行的错误 setup.py 文件
- google-cloud-platform - 如何使用 Composer 在 Dataproc 上运行 Notebook
- python - Python 3:pandas 组多索引和每个多索引 2 个单独列的平均值
- php - 使用 PHP 或 PHPMailer 从 GoDaddy 服务器发送电子邮件
- c++ - QTimer 在 QThread 中运行
- python - Django:租户的模板路径问题
- linux - 如何从shell脚本中的一行中提取两个部分数值
- google-bigquery - 如何将一个表中的列与 BigQuery 中另一个表中的数组进行比较?
- vbscript - MsgBox 显示旧图标。我该如何解决?