我知道在这个网站上有类似的问题,但是,他们似乎都没有充分回答我的问题。
这是我到目前为止所做的:
我有一个我在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?
但是,我想要一个更干净的解决方案,即导入文件的方式,以便列条目的条目存储为数值。
为任何帮助干杯!
答案 0 :(得分:32)
无论你在Excel中用什么代数来创建新列,都可以在R中更有效地完成。
请尝试以下操作:使用read.csv(... stringsAsFactors=FALSE)
将原始文件(在任何Excel操作之前)读入R中。 [如果这不起作用,请查看?read.table
(read.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])
代码执行以下操作:
这实际上通过保留原始列的数据类型(作为字符和数字)自动导入.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是问题的前提,我查看了它,发现数字的格式是每三位数字之间用逗号分隔。重新格式化而不用逗号解决了该问题。