6

我有一个文件,我读入 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 被作为 character() 读入,因为在某些情况下该值不是数字,而是具有诸如 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]))
 }

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

我得到与以前相同的结果。

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

4

3 回答 3

6

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

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

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

于 2012-05-04T09:13:26.667 回答
6

直接的问题是数据框的每一列只能包含一种类型的值。代码中的6inCA1[6,i]表示每列中只转换一个值,因此,在转换后插入它时,必须将其强制转换回字符串以匹配该列的其余部分。

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

 for (i in 8:31)
 {
     CA1[,i] <- as.numeric(as.character(CA1[,i]))
 }
于 2012-05-04T09:18:11.133 回答
2

按照汤米的回答,您可能会在读取数据时处理此问题。如果并且总是表示缺失值,您可以使用 中"MIS"的参数。"ACC""DEL"na.stringsread.table

read.table('foo.txt', header=TRUE, na.strings = c("MIS", "ACC", "DEL"))

如果还有其他字符串总是表示缺失值,那么您可以将它们添加到上述向量中。

但是,例如,如果"MIS"出现在列中Time_Frame并且它的含义不是表示缺失值,那么不要采取这种方法!

于 2012-05-04T10:27:01.600 回答