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


71

我对R非常陌生,无法访问已导入的数据集。我正在使用RStudio并在导入csv文件并将线从控制台窗口粘贴到源窗口时使用了导入数据集功能。该代码如下所示:

setwd("c:/kalle/R")
stuckey <- read.csv("C:/kalle/R/stuckey.csv")
point <- stuckey$PTS
time <- stuckey$MP

但是,数据不是像我惯常使用的整数或数值,而是因数,因此当我尝试绘制变量时,我只会得到直方图,而不是通常的图。在检查数据时,它似乎是有序的,只是因为它是因子形式,所以我无法使用它。


1
正如Hong Ooi所提到的,您可能拥有不应包含的非数字值。尝试查看数据(例如使用View(stuckey))以查看问题所在。
Richie Cotton

嗨,我有一个大文件,说以csv格式编写的54000 * 200维数据。我已经读取了Java文件中的数据,并且在转换为Double时也没有任何异常。但是,在R中阅读时,我遇到了同样的问题。我尝试了此处发布的方法,但未成功。PS:我是R的新手
Rudra Murthy 2014年

Answers:


71

数据导入功能(在这里read.csv():)以及全局选项都可以让您说出stringsAsFactors=FALSE应解决的问题。


17
stringsAsFactors在这种情况下,我认为不会有所帮助,因为它所做的只是控制字符到因子的转换。read.csv是否将列作为数字或字符导入并不影响这是潜在的问题。
Hong Ooi

5
而且,stringAsFactor = FALSE 通常将格式强制为字符,这与此处必须实现的恰好相反。
gented

我不推荐这种解决方案,因为它实际上只能转换为字符,绝对没有意义。
SmallChess

最好使用全局设置明智的默认值options('stringsAsFactors'=FALSE),然后您就不会忘记了。
smci

2
您和我都不知道,因为问题来了却没有可验证的数据集。因此,如果您以此为基础进行投票,那就错了。无论如何,我看不出为什么人们对一个八岁的答案感到如此兴奋。我们曾经无数次报道数据的读取,有时甚至涉及mcve。没有它,我们所做的只是猜测。
德克·埃德比布特

29

默认情况下,read.csv检查数据的前几行以查看是否将每个变量都视为数字。如果找到非数字值,则假定变量为字符数据,并将字符变量转换为因数。

数据集中的PTS和MP变量似乎包含非数字,这就是为什么您得到意外结果的原因。您可以使用以下命令将这些变量强制为数字

point <- as.numeric(as.character(point))
time <- as.numeric(as.character(time))

但是任何无法转换的值都会丢失。(R FAQ提供了一种稍微不同的因子->数字转换方法,但我永远不记得它是什么。)


factor2numeric这里:4dpiecharts.com/2011/01/10/...
里奇棉

是。这应该被接受。另一个答案未进行任何正确的转换。
SmallChess

21

您可以使用以下read.csv/read.*命令为所有命令 全局设置此设置 options(stringsAsFactors=F)

然后按如下所示读取文件: my.tab <- read.table( "filename.csv", as.is=T )


8
小心用例:“ stringsAsFactors”而不是“ StringsAsFactors”
artdv

1
或者,您可以简单地将选项添加到函数中:my.tab <- read.table("filename.csv", stringsAsFactors=F)
user890739 '16

我喜欢options方法,因为它可以与其他读取(例如read_rds)一起使用。
done_merson

我会一概不提read.delim(),它只不过是一个薄包装read.csv(... sep = "\t")。否则,此答案是对该问题的最佳答案。和专门使用的OP read.csv()(也只是一个薄包装read.table(... sep=',')
smci

7

导入csv数据文件时,导入命令应同时反映每列(;)和数值的浮点数分隔符之间的数据分隔符(对于数字变量= 2,5,则为“,”)。

因此,使用更多命令,用于导入csv的命令必须更加全面:

    stuckey <- read.csv2("C:/kalle/R/stuckey.csv", header=TRUE, sep=";", dec=",")

这应将所有变量导入为整数或数字。


3

这些答案均未提及colClasses参数,这是在中指定变量类的另一种方法read.csv

 stuckey <- read.csv("C:/kalle/R/stuckey.csv", colClasses = "numeric") # all variables to numeric

或者您可以指定要转换的列:

stuckey <- read.csv("C:/kalle/R/stuckey.csv", colClasses = c("PTS" = "numeric", "MP" = "numeric") # specific columns to numeric

请注意,如果无法将变量转换为数字,则将其默认转换为因数,这使得转换为数字更加困难。因此,建议仅将所有变量读为“字符” colClasses = "character",然后在读入csv后将特定的列转换为数值:

stuckey <- read.csv("C:/kalle/R/stuckey.csv", colClasses = "character")
point <- as.numeric(stuckey$PTS)
time <- as.numeric(stuckey$MP)

2

我也是R的新手,也遇到了完全相同的问题。但是后来我查看了我的数据,发现这是由于我的csv文件在所有数字列(例如:1,233,444.56而不是1233444.56)中使用逗号分隔符(,)引起的。

我在csv文件中删除了逗号分隔符,然后将其重新加载到R中。我的数据框现在将所有列识别为数字。

我确定在read.csv函数本身中有一种方法可以处理此问题。


1

仅当包含strip.white = TRUEread.csv命令中时,这才对我有效。

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


0

对我而言,解决方案是包括skip = 0(文件顶部要跳过的行数。可以设置为> 0)

mydata <-read.csv(文件=“ file.csv”,标头= TRUE,sep =“,”,跳过= 22)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.