我有一个包含数据的文件:
姓名:abcdef
价值:40个
编号:34
大小:1000
姓名:xyz
价值:4
编号:765
大小:5561000
姓名:qwerty
值:0
ID:4
大小:1000
但我会这样:
|名称|价值| Id |尺寸|
| ABCDEF | 40 | 34 | 1000 |
| XYZ | 4 | 765 | 5561000 |
| QWERTY | 0 | 4 | 1000 |
使用R标准命令可以做到这一点吗?
答案 0 :(得分:3)
我在splitstackshape中找不到想象的功能,也无法在SO上找到重复的问题,我也想象我曾经看过使用“属性值”或“标签值”作为搜索词,但我可以提供解决方案基于scan
处理多行数据的能力和sub
删除多余文本的能力。您显然可以删除悬空列:
inp <- scan(text=txt, what=list("n", "v", "i", "s", "blank"),sep="\n")
Read 3 records
names(inp) <- lapply(inp , function(col) sub("\\:.+","",col[1]) )
inp <- data.frame( lapply(inp, function(col) sub(".+\\:[ ]{0,1}","",col) ) )
> inp
Name Value Id Size c............
1 abcdef 40 34 1000
2 xyz 4 765 5561000
3 qwerty 0 4 1000
这将要求数据非常规律。每个部分需要5行,并且值的一部分内的顺序必须是常量,尽管应该正确处理空白值。
使用的数据:
txt <- "Name: abcdef
Value:40
Id:34
Size: 1000
Name: xyz
Value:4
Id:765
Size: 5561000
Name: qwerty
Value:0
Id:4
Size: 1000
"