读取带有R的csv文件,其中百分比为X%且不同的NA字符

时间:2014-05-22 11:32:55

标签: r csv import

我的任务是将csv文件读入R.我有8个文件,最多70列。 列是字符串,分类值,数字和百分比,在某种意义上,值是10%而不是0.1

此外,NAs在列中有所不同,有时它是一个数字字符(例如9),有时它是一个类似于'不适用的字符串。

我可以使用一些gsub synthax来摆脱"%"签,但我想这是一个常见的问题。 此外,我想避免必须在每个文件中指定每个列是否是"%"格式。

是否有可以将百分比数字作为数字读取的包或函数? 随着不同的NA,我想我将不得不坚持使用gsub解决方案 - 对吗?

这是一个例子。数值数据9是NA,第三列"不适用"是NA。

stringsAsFactors=FALSE
x.numeric = c(1,2,3,9)
x.per = c("10%","20%","30%","40%")
x.categorical = c("1","2","does not apply","4")
data = data.frame(x1 = x.numeric, x2= x.per, x3 = x.categorical)
head(data)
str(data)

1 个答案:

答案 0 :(得分:2)

使用NAs,您不一定需要使用涉及gsub或其中一些亲属的解决方案。 read.table()中有一个参数na.strings,你可以同时指定几个NA字符串。例如,您发布的示例表可以使用以下命令在R中读取:

test<-read.table("clipboard", header=T, sep="\t", na.strings=c("9", "does not apply"))

从剪贴板中获取表格,并转换&#34; 9&#34;并且&#34;不适用&#34;到结果表中的NA:

test
   x1  x2 x3
1  1 10%  1
2  2 20%  2
3  3 30% NA
4 NA 40%  4

这样可以正常工作,除非某些列包含例如&#34; 9&#34;因为数据和其他人的意思是NA。

对于百分比问题,使用gsub方法可能最容易解决。百分比问题的另一个解决方案可能是定义新的coersion函数,然后在read.table()中指定colClasses参数。这样的事情应该有效:

# New coersion function
setAs("character", "num_pct", function(from) as.numeric(gsub("%", "", from))/100)
# Define column classes for the columns in the table
test<-read.table("clipboard", header=T, sep="\t", na.strings=c("9", "does not apply"), 
                 colClasses=c("character", "num_pct", "character"))

此命令现在读入包含列的指定类的表,并将表的第二列中的百分比转换为动态的十进制数。