我有一个文件,我读入R并被转换为数据框(称为CA1),其结构如下:
Station_ID Guage_Type Lat Long Date Time_Zone Time_Frame H0 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13 H14 H15 H16 H17 H18 H19 H20 H21 H22 H23
1 4457700 HI 41.52 124.03 19480701 8 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
2 4457700 HI 41.52 124.03 19480705 8 LST 0 1 1 1 1 1 2 2 2 4 5 5 4 7 1 1 0 0 10 13 5 1 1 3
3 4457700 HI 41.52 124.03 19480706 8 LST 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4 4457700 HI 41.52 124.03 19480727 8 LST 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5 4457700 HI 41.52 124.03 19480801 8 LST 0 0 0 0 0 0 0 0 0 0 0 0 MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS MIS
6 4457700 HI 41.52 124.03 19480817 8 LST 0 0 0 0 0 0 ACC ACC ACC ACC ACC ACC 6 1 0 0 0 0 0 0 0 0 0 0
H0到H23作为字符()读入,因为有些情况下,该值不是数字,并且将具有诸如MIS,ACC或DEL之类的值。
我的问题:有没有办法将每列H0到H23的值分类为数字,并且字符值(MIS,ACC,DEL)为NA或NAN,如果它们是(我可以测试) .nan或is.na)所以我可以运行一些数字模型。或者最好将字符值更改为标识符,例如-9999?
我尝试了很多方法。我在这个网站上找到了一些但没有工作。如:
for (i in 8:31)
{
CA1[6,i] <- as.numeric(as.character(CA1[6,i]))
}
当然会发出警告但是当我测试两个特定值is_numeric()(CA1 [6,8]和CA1 [6,19])时,我得到两个错误的声明。第一个我不明白为什么,但第二个我做,因为它是一个“”。但是,我可以使用is.na(CA1 [6,19])测试它并返回true,这对我来说很好,因为它不是数字。
我尝试的第二种方式是:
for (i in 8:31)
{
CA1[6,i] <- as.numeric(levels(CA1[6,i]))[CA1[6,i]]
}
我得到的结果和以前一样。
有没有办法以有效的方式做我想做的事情?非常感谢您的帮助。谢谢
答案 0 :(得分:6)
读入数据时,通常可以指定列类型。例如,read.table
/ read.csv
有一个colClasses
参数。
# Something like this
read.table('foo.txt', header=TRUE, colClasses=c('integer', 'factor', 'numeric', numeric', 'Date'))
有关详细信息,请参阅?read.table
。
答案 1 :(得分:6)
直接问题是数据框的每一列只能包含一种类型的值。代码中6
中的CA1[6,i]
表示每列中只转换一个值,因此,在转换后插入时,必须将其强制转换回字符串以匹配其余列专栏。
您可以通过一次转换整个列来解决此问题,以便完全替换该列。即删除6
:
for (i in 8:31)
{
CA1[,i] <- as.numeric(as.character(CA1[,i]))
}
答案 2 :(得分:2)
根据Tommy的回答,您在阅读数据时可能会处理此问题。如果"MIS"
,"ACC"
和"DEL"
始终表示缺失值,则可以使用na.strings
中的read.table
参数。
read.table('foo.txt', header=TRUE, na.strings = c("MIS", "ACC", "DEL"))
如果有其他字符串始终表示缺失值,则可以将它们添加到上面的矢量中。
但是,例如,如果"MIS"
出现在Time_Frame
列中,并且除了表示缺失值之外还有其他含义,那么请不要采用这种方法!!