42

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

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

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

将 csv 数据集导入到 R 但值成为因素

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

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

如何在不丢失信息的情况下将因子转换为整数\数字?

但是,我想要一个更简洁的解决方案,即一种导入文件的方法,以便将列条目的条目存储为数值。

为任何帮助干杯!

4

6 回答 6

38

无论您在 Excel 中为创建新列所做的任何代数都可能在 R 中更有效地完成。

请尝试以下操作:使用 . 将原始文件(在任何 excel 操作之前)读入 R 中read.csv(... stringsAsFactors=FALSE)。[如果这不起作用,请查看?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 中完成的任务相同的任务时需要任何帮助,这里有很多人很乐意为您提供帮助

于 2012-12-04T15:53:54.823 回答
13

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

如果其他数字变量列中的缺失值被编码为“ NA”以外的其他内容,例如“ .”或“ N/A”,则这些行将被解释为character,然后将整个列转换为character

因此,如果您的缺失值不是“ NA”,您需要在na.strings.

于 2014-06-05T15:02:34.923 回答
9

如果您正在处理大型数据集(即具有大量列的数据集),上述解决方案可能手动繁琐,并且需要您先验地知道哪些列是数字。

试试这个。

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. 识别数据中的哪些列是数字的(假设将数据转换为数字时 NA 小于 50% 的列确实是数字的)。
  4. 将数字和字符列合并到最终数据集中。

这基本上通过保留原始列的数据类型(作为字符和数字)来自动导入 .csv 文件。

于 2016-02-18T18:51:17.773 回答
3

read.csv在命令中包含这个对我有用:strip.white = TRUE

(我在这里找到了这个解决方案。)

于 2018-08-29T09:33:40.317 回答
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)
}
于 2016-12-21T11:49:56.217 回答
0

我有一个类似的问题。基于 Joshua 的前提,即 excel 是我查看的问题,发现这些数字在每三个数字之间用逗号格式化。不带逗号的重新格式化解决了这个问题。

于 2019-09-21T23:45:14.560 回答