将csv文件导入R - 读取为字符的数值

时间:2012-12-04 15:23:56

标签: r

我知道在这个网站上有类似的问题,但是,他们似乎都没有充分回答我的问题。

这是我到目前为止所做的:

我有一个我在excel中打开的csv文件。我以代数方式操纵列以获得新的列“A”。我使用read.csv()将文件导入R,并将A列中的条目存储为因子 - 我希望它们存储为数字。我在这个主题上找到了这个问题:

Imported a csv-dataset to R but the values becomes factors

根据建议,我在stringsAsFactors = FALSE中包含read.csv()作为参数,但是,正如Hong Ooi在上面链接的页面中所建议的那样,这不会导致列A中的条目存储为数值。

可能的解决方案是使用以下页面中给出的建议:

How to convert a factor to an integer\numeric without a loss of information?

但是,我想要一个更干净的解决方案,即导入文件的方式,以便列条目的条目存储为数值。

为任何帮助干杯!

6 个答案:

答案 0 :(得分:32)

无论你在Excel中用什么代数来创建新列,都可以在R中更有效地完成。

请尝试以下操作:使用read.csv(... stringsAsFactors=FALSE)原始文件(在任何Excel操作之前)读入R中。 [如果这不起作用,请查看?read.tableread.csv换行),但可能存在其他一些潜在问题。

例如:

   delim = ","  # or is it "\t" ?
   dec = "."    # or is it "," ?
   myDataFrame <- read.csv("path/to/file.csv", header=TRUE, sep=delim, dec=dec, stringsAsFactors=FALSE)

然后,假设您的数字列是第4列

   myDataFrame[, 4]  <- as.numeric(myDataFrame[, 4])  # you can also refer to the column by "itsName"

<小时/> 最后,如果您在R中完成与在Excel中完成的相同任务需要任何帮助,那么有很多人愿意帮助您

答案 1 :(得分:10)

read.table(及其亲属)中,na.strings参数指定哪些字符串被解释为缺失值NA。默认值为na.strings = "NA"

如果否则数字变量列中的缺失值被编码为&#34; NA&#34;以外的其他值,例如&#34; .&#34;或&#34; N/A&#34;,这些行将被解释为character,然后整个列都会转换为character

因此,如果您的缺失值不是&#34; NA&#34;,则需要在na.strings中指定它们。

答案 2 :(得分:4)

如果您正在处理大型数据集(即具有大量列的数据集),则上述解决方案可能会非常麻烦,并且需要您知道哪些列是数字先验

试试这个。

char_data <- read.csv(input_filename, stringsAsFactors = F)
num_data <- data.frame(data.matrix(char_data))
numeric_columns <- sapply(num_data,function(x){mean(as.numeric(is.na(x)))<0.5})
final_data <- data.frame(num_data[,numeric_columns], char_data[,!numeric_columns])

代码执行以下操作:

  1. 将您的数据导入为字符列。
  2. 将数据实例创建为数字列。
  3. 标识数据中的哪些列是数字的(假设在将数据转换为数字时,少于50%的NA的列确实是数字的。)
  4. 将数字和字符列合并到最终数据集中。
  5. 这实际上通过保留原始列的数据类型(作为字符和数字)自动导入.csv文件。

答案 3 :(得分:1)

基于dmanuge代码的data.table版本:

convNumValues<-function(ds){
  ds<-data.table(ds)
  dsnum<-data.table(data.matrix(ds))
  num_cols <- sapply(dsnum,function(x){mean(as.numeric(is.na(x)))<0.5})
  nds <- data.table(  dsnum[, .SD, .SDcols=attributes(num_cols)$names[which(num_cols)]]
                        ,ds[, .SD, .SDcols=attributes(num_cols)$names[which(!num_cols)]] )
return(nds)
}

答案 4 :(得分:1)

read.csv命令中包括这个对我来说很有效:strip.white = TRUE

(我找到了此解决方案here。)

答案 5 :(得分:0)

我有类似的问题。基于Joshua认为excel是问题的前提,我查看了它,发现数字的格式是每三位数字之间用逗号分隔。重新格式化而不用逗号解决了该问题。