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

46

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

到目前为止,我已经做了以下工作:

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

将csv数据集导入R,但值变成因子

根据建议,我在read.csv()中包括stringsAsFactors = FALSE作为参数,但是如以上链接页面上所述的Hong Ooi所建议的那样,这并没有使列A中的条目被存储为数值。

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

如何将因子转换为整数\numeric而不丢失信息?

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

感谢任何帮助!


6
Excel正在搞乱你的文本文件。打开csv文件并在文本编辑器中查看,以了解Excel是如何破坏它的。 - Joshua Ulrich
2
可能是小数符号的问题吗?检查CSV文件中使用的小数符号。您可以在read.csv中使用dec选项指定要用作小数符号的字符。有关更多信息,请参见?read.csv - djhurio
按照Joshua的指示做,Excel有一种倾向会破坏CSV文件的头部。通常我会使用选项(stringsAsFactors = FALSE)来避免因素的影响。 - Gago-Silva
8个回答

39
无论在 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相同的任务,并且需要帮助,这里有很多人乐意为您提供帮助。


2
谢谢。这是一个非常有用的清单。在这种情况下,问题是通过在R中进行代数操作而不是Excel中解决的。 - user32259

14
read.table(及其相关函数)中,na.strings 参数指定哪些字符串应被解释为缺失值NA。默认值为na.strings = "NA"
如果除了"NA"之外的其他字符串(如"."或"N/A")编码为缺失值,则这些行将被解释为character,然后整个列将转换为character
因此,如果您的缺失值不是"NA",则需要在na.strings中指定它们。

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. 确定哪些列是数值列(假设在将您的数据转换为数值列时,具有少于50% NA的列确实是数值列)。
  4. 将数值列和字符列合并成最终数据集。
这实际上通过保留原始列的数据类型(字符和数值)自动化了导入您的.csv文件。

1
请注意,此方法还将日期/时间列转换为数字列! - Ali Safari

3
在我的情况下,在read.csv命令中包括strip.white = TRUE可行。
(我在这里找到了这个解决方案。)

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)
}

0

你好,@Shawn Hemelstrand,以下是详细步骤:

示例矩阵文件.csv中包含“Filtered”单词

我在Linux命令终端中打开了file.csv文件

vi file.csv 然后按“Esc shift:” 并在底部输入以下命令 "%s/Filtered/NA/g" 按回车键 然后按“Esc shift:” 在底部写入“wq”(这将保存文件并退出vim编辑器)

然后在R脚本中读取该文件。

data<- read.csv("file.csv", sep = ',', header = TRUE)
str(data)

所有列都是之前的字符类型,现在都是数字类型。

如果需要更多帮助,分享您的txt或csv文件会更容易。


0

我有类似的问题。基于约书亚的前提,认为Excel是问题所在,我查看了它,发现数字的格式是每三位之间用逗号分隔的。去掉逗号重新进行格式化修复了问题。


0
所以,当我读取csv文件时,在我的数据文件中遇到了类似的情况。所有数字值都变成了字符类型。但是在我的文件中有一个值为“Filtered”的单词而不是NA。我在Linux终端的vim编辑器中使用命令“<%s/Filtered/NA/g>”将“Filtered”转换为NA并保存该文件,然后在R中读取它,所有的值都变成了num类型而不是char类型。 看起来字符值“Filtered”导致所有值都成为char格式。

问候!如果您能明确展示您的代码而不是以这种方式描述它,那将非常有帮助。 - Shawn Hemelstrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接