将csv导入R - 数值仍被视为因子

时间:2015-06-03 09:15:57

标签: r csv numeric

我试图获取一个读取为要读取或转换为数字的因子的列。所有带有“stringAsFactors = FALSE”或“as.numeric”的建议都无法按预期工作。 (见附件)

data.csv是一个简单的例子,它在Notepad ++和EmEditor中没有显示奇怪的特殊字符。 “Temp”(第5行)只有一个系统错误,“rH”(第4行)只有一个。

> fTimeSeries<- read.csv2('data.csv', header = TRUE, sep=";", dec=",", stringsAsFactors=FALSE)

> head(fTimeSeries)
  Station          DatumZeit   Temp    rH      Tp      Ld
1     526   02.11.2010 08:36   15,9    58.4    7.7     991.1
2     526   02.11.2010 08:38   15,6    58.8    7.6     991.3
3     526   02.11.2010 08:40   14,9    60.8    7.4     991.1
4     526   02.11.2010 08:42   14,3      NA    7.4     991.4
5     526   02.11.2010 08:44    aaa    64.2    7.5     991.3
6     526   02.11.2010 08:46   14,2    64.9    7.7     991.2

> fTimeSeries[,3]
 [1] "15,9" "15,6" "14,9" "14,3" "aaa"  "14,2" "14,2" "13,9" "13,9" "13,6" "13,6" "13,6" "13,4" "13,4" "13,7" "13,8" "13,9" "14,1" "14,3" "14,4" "14,5" "14,2" "14,2" "14,1" "14,1" "14,2"
[27] "14,1" "14,1" "14"   "14"   "14,1" "14"   "13,9" "13,9" "14"   "14"   "13,9" "14"   "14,1" "14,2" "14,2" "14,2" "14,2" "14,2" "14,2" "14,2" "14,2"

在第3栏“Temp”中,我希望得到数字而在第5行,而不是“aaa”NA。

所以我试着转换它:

fTimeSeries[,3] <- as.numeric(fTimeSeries[,3], dec=',')
Warnmeldung:
NAs durch Umwandlung erzeugt
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 14 14 NA 14 NA NA 14 14 NA 14 NA NA NA NA NA NA NA NA NA

但没有成功。 as.numeric似乎只是转换没有小数分隔符的数字,即使我告诉小数点分隔符是什么。 (我也试过没有选项dec =“,”没有成功。)

最后,我尝试在这里得到一些答案中建议的水平:

> levels(fTimeSeries$Temp)
NULL

> levels(fTimeSeries[,3])
NULL

> levels(fTimeSeries)
NULL

> levels(fTimeSeries$rH)
NULL

> head(fTimeSeries)
  Station          DatumZeit   Temp    rH      Tp      Ld
1     526   02.11.2010 08:36     NA    58.4    7.7     991.1
2     526   02.11.2010 08:38     NA    58.8    7.6     991.3
3     526   02.11.2010 08:40     NA    60.8    7.4     991.1
4     526   02.11.2010 08:42     NA      NA    7.4     991.4
5     526   02.11.2010 08:44     NA    64.2    7.5     991.3
6     526   02.11.2010 08:46     NA    64.9    7.7     991.2

我在Windows7 64位环境中使用R

1 个答案:

答案 0 :(得分:0)

这个适用于我的模拟数据。 df$x是一个因素

df <- data.frame(x=c("12,1","aa","15,6",61))

as.numeric(gsub(",", ".", as.character(df$x)))

# [1] 12.1   NA 15.6 61.0

使用您的示例进行更新:

您的数据:

> fTimeSeries<- read.csv2('data.csv', header = TRUE, sep=";", dec=",", stringsAsFactors=FALSE)
> head(fTimeSeries)
  Station        DatumZeit Temp   rH  Tp    Ld
1     526 02.11.2010 08:36 15,9 58.4 7.7 991.1
2     526 02.11.2010 08:38 15,6 58.8 7.6 991.3
3     526 02.11.2010 08:40 14,9 60.8 7.4 991.1
4     526 02.11.2010 08:42 14,3 <NA> 7.4 991.4
5     526 02.11.2010 08:44  aaa 64.2 7.5 991.3
6     526 02.11.2010 08:46 14,2 64.9 7.7 991.2

无法识别的列:

> class(fTimeSeries$Temp)
[1] "character"

申请我的解决方案:

> fTimeSeries$Temp <- as.numeric(gsub(",", ".", as.character(fTimeSeries$Temp)))
> class(fTimeSeries$Temp)
[1] "numeric"

您的data.frame成为:

> fTimeSeries
  Station        DatumZeit Temp   rH  Tp    Ld
1     526 02.11.2010 08:36 15.9 58.4 7.7 991.1
2     526 02.11.2010 08:38 15.6 58.8 7.6 991.3
3     526 02.11.2010 08:40 14.9 60.8 7.4 991.1
4     526 02.11.2010 08:42 14.3 <NA> 7.4 991.4
5     526 02.11.2010 08:44   NA 64.2 7.5 991.3
6     526 02.11.2010 08:46 14.2 64.9 7.7 991.2