r - 将人类可读的连接表读取到 tibble
问题描述
我有一些人类可读的制表符分隔数据,格式如下:
Table_1
10 20 30
30 40 50
10 20 40
Table_2
20 30 40
10 50 60
30 20 10
30 10 40
Table_3
20 30 50
30 50 40
我想将表名保留为一列,如下所示:
Table_1 10 20 30
Table_1 30 40 50
Table_1 10 20 40
Table_2 20 30 40
Table_2 10 50 60
Table_2 30 20 10
Table_2 30 10 40
Table_3 20 30 50
Table_3 30 50 40
我可能可以用awk
and解决这个问题sed
,但我更喜欢使用这种tidyr
方法。
解决方案
根据 'Table' 子字符串的出现创建一个分组列,使用first
('grp') 分组的列中的观察值创建一个新列,删除第一个观察值 ( slice
) 并转换type
library(dplyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(V1, 'Table'))) %>%
mutate(Table = first(V1)) %>%
slice(-1) %>%
ungroup %>%
type.convert(as.is = TRUE) %>%
select(Table, everything(), -grp)
-输出
# A tibble: 9 x 4
Table V1 V2 V3
<chr> <int> <int> <int>
1 Table_1 10 20 30
2 Table_1 30 40 50
3 Table_1 10 20 40
4 Table_2 20 30 40
5 Table_2 10 50 60
6 Table_2 30 20 10
7 Table_2 30 10 40
8 Table_3 20 30 50
9 Table_3 30 50 40
数据
df1 <- read.table('file.txt', header = FALSE, fill = TRUE)
df1 <- structure(list(V1 = c("Table_1", "10", "30", "10", "Table_2",
"20", "10", "30", "30", "Table_3", "20", "30"), V2 = c(NA, 20L,
40L, 20L, NA, 30L, 50L, 20L, 10L, NA, 30L, 50L), V3 = c(NA, 30L,
50L, 40L, NA, 40L, 60L, 10L, 40L, NA, 50L, 40L)), class = "data.frame", row.names = c(NA,
-12L))
推荐阅读
- javascript - 有什么方法可以检测当前标签 URL 哈希是否已更改 - Chrome 扩展开发
- ssl - 为什么当我的 CA 证书过期时 SSLLabs 说我的证书很好?
- python - 在 Linux 上连接到 SQL Server 时 Pyodbc 超时
- html - 移动视图上导航栏引导程序的问题
- vue.js - vue 实例与子 vue 实例可能或替代方法?
- php - 无法使用命令“laravel new”在 Process.php 第 332 行中创建新的 laravel 项目:
- python-3.x - 填充二维数组时避免嵌套 for 循环
- c++ - 这个 MLP 反向传播实现有什么问题?
- java - 从 CSV 文件中读取并创建对象
- angular - aws API 发出的 HttpRequests 拦截器