我的任务是将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)
答案 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"))
此命令现在读入包含列的指定类的表,并将表的第二列中的百分比转换为动态的十进制数。