将字符转换为R中的数字值

时间:2012-05-04 09:04:05

标签: r casting dataframe

我有一个文件,我读入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]]
 }

我得到的结果和以前一样。

有没有办法以有效的方式做我想做的事情?非常感谢您的帮助。谢谢

3 个答案:

答案 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列中,并且除了表示缺失值之外还有其他含义,那么请不要采用这种方法!!