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

Luc*_*uez 6 casting r 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
Run Code Online (Sandbox Code Playgroud)

H0到H23作为字符()读入,因为有些情况下,该值不是数字,并且将具有诸如MIS,ACC或DEL之类的值.

我的问题:有没有办法将每列H0到H23的值分类为数字,并且字符值(MIS,ACC,DEL)为NA或NAN,如果它们是(is.nan或is.na)所以我可以运行一些数字模型.或者最好将字符值更改为标识符,例如-9999?

我尝试了很多方法.我在这个网站上找到了一些但没有工作.如:

 for (i in 8:31)
 {
     CA1[6,i] <- as.numeric(as.character(CA1[6,i]))
 }
Run Code Online (Sandbox Code Playgroud)

这当然会发出警告,但是当我测试两个特定值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]]
 }
Run Code Online (Sandbox Code Playgroud)

我得到了与以前相同的结果.

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

Tom*_*mmy 6

读入数据时,通常可以指定列类型.例如,read.table/ read.csv有一个colClasses参数.

# Something like this
read.table('foo.txt', header=TRUE, colClasses=c('integer', 'factor', 'numeric', numeric', 'Date'))
Run Code Online (Sandbox Code Playgroud)

有关?read.table更多信息,请参阅


huo*_*uon 6

当前的问题是数据框的每一列只能包含一种类型的值.的6CA1[6,i]代码中的指只有一个单一的值被转换在每列中,所以,当它被插入转换后,它必须被强制回字符串到柱的其余部分相匹配.

您可以通过一次转换整个列来解决此问题,以便完全替换该列.即删除6:

 for (i in 8:31)
 {
     CA1[,i] <- as.numeric(as.character(CA1[,i]))
 }
Run Code Online (Sandbox Code Playgroud)