将csv-dataset导入R但值变为因子

时间:2011-03-03 23:05:39

标签: r r-factor read.csv

我是R的新手,我无法访问我导入的数据集。我正在使用RStudio并在导入我的csv文件时使用了导入数据集功能,并将该行从控制台窗口粘贴到源窗口。代码如下:

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

然而,数据不是我所习惯的整数或数字,而是因素,所以当我尝试绘制变量时,我只得到直方图,而不是通常的情节。当检查数据时,它似乎是有序的,只是我无法使用它,因为它是因子形式。

8 个答案:

答案 0 :(得分:61)

数据导入功能(此处为:read.csv())以及全局选项都可以说明stringsAsFactors=FALSE应该解决此问题。

答案 1 :(得分:27)

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

看起来数据集中的PTS和MP变量包含非数字,这就是您获得意外结果的原因。您可以使用

强制这些变量为数字
point <- as.numeric(as.character(point))
time <- as.numeric(as.character(time))

但是任何无法转换的值都会丢失。 (R常见问题解答给出了一个稍微不同的因子 - &gt;数字转换方法,但我永远不记得它是什么。)

答案 2 :(得分:20)

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

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

答案 3 :(得分:5)

导入csv数据文件时,import命令应反映每列(;)和数值的float-number分隔符之间的数据分隔(对于数值变量= 2,5,这将是“,”)。

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

androidIntentUrl = 'intent://uber/#Intent;package=com.ubercab;scheme=uber;end',

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

答案 4 :(得分: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

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

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

答案 5 :(得分:2)

我也是R的新手并面临同样的问题。但后来我查看了我的数据并注意到它是由于我的csv文件在所有数字列中使用逗号分隔符(,)而引起的(例如:1,233,444.56而不是1233444.56)。

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

我确信有一种方法可以在read.csv函数中处理它。

答案 6 :(得分:1)

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

(我找到了解决方法here。)

答案 7 :(得分:0)

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

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