我有一个相当大的(大约1200个变量,每个有14个观察值)数据集,存储在一个文本文件中,有一个非常奇怪的,绝对不是tidy
结构。实际上,每个变量都存储为一行而不是一列,第一行和第二行分别是变量名和该变量的测量单位。这是一个示例数据集:
Date --- 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016
PT-AMB#SRV V 1.403400 1.403207 1.403265 1.403326 1.403454 1.403783 1.404924 1.404962 1.405291 1.404951 1.404685 1.404812 1.404433 1.404428
PS1-SEC20#SRV V 2.395769 2.416003 2.362276 2.253045 2.139873 1.939328 2.450442 2.294791 2.085946 1.929666 2.634747 3.067008 3.081949 3.095456
第一个变量称为Date
,它是非维度的(单位---
),第二个变量是PT-AMB#SRV
,以伏特V
为单位测量,因此上。注意:同一行上的两个条目由原始文件中的选项卡分隔。我在Stack Overflow上复制和粘贴数据后,我不确定这是否保存。
首先,我尝试读取这样的数据:
df=read.table("TEST.txt",sep="\t")
我收到以下错误:
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
line 2 did not have 16 elements
如果我手动编辑第二个(和第三个)变量名称,将#
更改为-
,则错误消失。
第一个问题是:为什么会发生这种情况,我该如何防止它发生?如果我需要在所有变量名称中将所有#
更改为-
,我该如何自动执行此操作?最好在R
中,否则命令行正常(我在Windows中工作)。
第二个问题:在修改了所有#
(此示例数据集中只有两个)后,我用
df=read.table("TEST.txt",sep="\t")
我明白了:
V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16
1 Date --- 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016
2 PT-AMB-SRV V 1.403400 1.403207 1.403265 1.403326 1.403454 1.403783 1.404924 1.404962 1.405291 1.404951 1.404685 1.404812 1.404433 1.404428
3 PS1-SEC20-SRV V 2.395769 2.416003 2.362276 2.253045 2.139873 1.939328 2.450442 2.294791 2.085946 1.929666 2.634747 3.067008 3.081949 3.095456
然后我尝试转置df
,以便将变量存储在列中:
df_t=t(df)
我明白了:
[,1] [,2] [,3]
V1 "Date" "PT-AMB-SRV" "PS1-SEC20-SRV"
V2 "---" "V" "V"
V3 "1/19/2016" "1.403400" "2.395769"
V4 "1/19/2016" "1.403207" "2.416003"
V5 "1/19/2016" "1.403265" "2.362276"
V6 "1/19/2016" "1.403326" "2.253045"
V7 "1/19/2016" "1.403454" "2.139873"
V8 "1/19/2016" "1.403783" "1.939328"
V9 "1/19/2016" "1.404924" "2.450442"
V10 "1/19/2016" "1.404962" "2.294791"
V11 "1/19/2016" "1.405291" "2.085946"
V12 "1/19/2016" "1.404951" "1.929666"
V13 "1/19/2016" "1.404685" "2.634747"
V14 "1/19/2016" "1.404812" "3.067008"
V15 "1/19/2016" "1.404433" "3.081949"
V16 "1/19/2016" "1.404428" "3.095456"
不再是数据框,而是一个字符数组。绝对不是我想要的。我怎样才能使变量存储在列中(整齐的数据集)?我认为问题是包含测量单位的列,但在转置
之前将其删除df[,"V2"]=NULL
没有解决任何问题。也许tidyr
可以在这里提供帮助,但我不知道如何。
答案 0 :(得分:1)
将数据读入DF0,转置它并使用type.convert
获取列的相应类。设置名称并使用适当的格式字符串将第一列转换为"Date"
类。
# replace text = Lines with file = "myfile.dat"
DF0 <- read.table( text = Lines, colClasses = "character", comment = "" )
L <- lapply( as.data.frame( tail( t(DF0), -2 ), stringsAsFactors = FALSE ), type.convert )
DF <- setNames( as.data.frame(L), DF0[[1]] )
DF$Date <- as.Date( DF$Date, format = "%m/%d/%Y" )
结果是:
> DF
Date PT-AMB#SRV PS1-SEC20#SRV
1 2016-01-19 1.403400 2.395769
2 2016-01-19 1.403207 2.416003
3 2016-01-19 1.403265 2.362276
4 2016-01-19 1.403326 2.253045
5 2016-01-19 1.403454 2.139873
6 2016-01-19 1.403783 1.939328
7 2016-01-19 1.404924 2.450442
8 2016-01-19 1.404962 2.294791
9 2016-01-19 1.405291 2.085946
10 2016-01-19 1.404951 1.929666
11 2016-01-19 1.404685 2.634747
12 2016-01-19 1.404812 3.067008
13 2016-01-19 1.404433 3.081949
14 2016-01-19 1.404428 3.095456
注意:我们使用了这个输入:
Lines <-
"Date --- 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016 1/19/2016
PT-AMB#SRV V 1.403400 1.403207 1.403265 1.403326 1.403454 1.403783 1.404924 1.404962 1.405291 1.404951 1.404685 1.404812 1.404433 1.404428
PS1-SEC20#SRV V 2.395769 2.416003 2.362276 2.253045 2.139873 1.939328 2.450442 2.294791 2.085946 1.929666 2.634747 3.067008 3.081949 3.095456"