读取带有R、百分比为X%和不同NA字符的csv文件



我的任务是将csv文件读取为R.我有8个文件,最多70列。列是字符串、分类值、数字和百分比,即值是10%而不是0.1

此外,NAs在列中是不同的,有时它是一个数字字符(例如9),有时它是一个字符串,如'does not apply'。

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

是否有一个包或函数可以将百分比数字读取为数字?对于不同的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)

对于NAs,您不一定需要使用涉及gsub或它的一些同类的解决方案。这是有争议的。在read.table()中指定多个NA字符串,可以同时指定多个NA字符串。例如,您发布的示例表可以用以下命令在R中读取:

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

从剪贴板中获取表格,并将"9"one_answers"does not apply"转换为结果表中的NAs:

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

这可以正常工作,除非某些列包含,例如,"9"作为数据,而其他列具有它的含义NA。

对于百分比问题,使用gsub方法可能是最容易解决的。百分比问题的另一个解决方案可能是定义一个新的转换函数,然后在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"))

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

最新更新