如何阅读因素'在R?

时间:2015-07-06 07:45:18

标签: r csv

我有一个大的csv文件,有51993行和18列。这是表格的一部分:

head(ddd)
country.of.birth age   sex X2000 X2001 X2002 X2003 X2004 X2005 X2006 X2007
Afghanistan       0    men     0     0     1     2     2     0     1     1
Afghanistan       0  women     1     1     0     0     1     0     0     0
Afghanistan       1    men     0     2     5     2     3     4     1     1
Afghanistan       1  women     4     1     4     2     3     2     3     2
Afghanistan       2    men     5     0     8     7     7     3     5     3
Afghanistan       2  women     4     8     3     9     4     4     4     3

在主要的csv文件中,列是:出生国家,年龄,性别,然后是2000年到2014年的年份。我的问题是为什么R在每年的数字之前加上X?

当我使用str()函数时,我得到了:

> str(ddd)
'data.frame':   15264 obs. of  18 variables:
$ country.of.birth: Factor w/ 261 levels "0","1","10","103",..: 51 51 51 51 51 51 51 51 51 51 ...
$ age             : Factor w/ 38 levels "","0 ","1 ","10 ",..: 2 2 3 3 14 14 17 17 20 20 ...
$ sex             : Factor w/ 39 levels "","0 ","1 ","10 ",..: 38 39 38 39 38 39 38 39 38 39 ...
$ X2000           : Factor w/ 786 levels "","0","1","10",..: 2 3 2 478 555 478 92 4 205 716 ...
$ X2001           : int  0 1 2 1 0 8 11 8 26 19 ...
$ X2002           : int  1 0 5 4 8 3 13 18 22 15 ...
$ X2003           : int  2 0 2 2 7 9 15 13 23 33 ...
$ X2004           : int  2 1 3 3 7 4 11 15 21 22 ...
$ X2005           : int  0 0 4 2 3 4 10 6 13 16 ...
$ X2006           : int  1 0 1 3 5 4 8 13 20 10 ...
$ X2007           : int  1 0 1 2 3 3 6 7 9 17 ...
$ X2008           : int  0 0 2 0 4 5 4 6 8 9 ...
$ X2009           : int  0 1 1 4 7 3 9 10 11 12 ...
$ X2010           : int  1 1 6 4 8 10 17 10 21 16 ...
$ X2011           : int  0 5 9 6 21 18 16 27 34 24 ...
$ X2012           : int  3 5 5 16 30 22 44 48 46 49 ...
$ X2013           : int  3 0 12 19 24 34 54 46 76 71 ...
$ X2014           : int  2 3 15 3 21 29 37 48 64 62 ...

正如您所注意到的,性别是因素,但有39个级别,而它只有两个值(男性)和(女性)。此外,2000年(表中的X2000)是一个具有786级别的因子,它应该被读作" int"。为什么R读取了可观察的"性别"有这么多的水平,为什么它把2000年看作是一个因素,而它把其他人读成int(就像是这样)?

编辑: 年龄栏具有以下形式的值:20-24,25-30,......直到85-90。和另一个类别为90 +

2 个答案:

答案 0 :(得分:2)

X放在列名前面,因为R不允许列名的第一个字符为数字(尝试data.frame(a = 1:10, "3" = runif(10))

年龄是一个因素,因为你有垃圾箱,你观察到的是预期的行为。 R不会将区间作为数字处理,而是作为因子处理。

性变量很奇怪并且给出了当前可用的数据,我会说变量代表性别以外的东西,至少在数据集的一部分。数据集是否已拼接在一起?也许复制/粘贴有错误。请参阅levels(ddd$sex)以解开所有可能的级别。

答案 1 :(得分:1)

read.table及其相关函数的默认行为是使所有列名在语法上有效。这意味着可以在$运算符之后无需引用即可使用它们。但是,可以使用check.names = FALSE参数更改此行为。这意味着您最终会得到名为2000等的列。要将这些列与$一起使用,它们将需要反引号,例如。

ddd$`2000`

如果您想将这些列用于非标准评估,例如

,情况也是如此
ggplot(ddd, aes(x = sex, y = `2000`)) + geom_boxplot()

对于性别栏,进一步向下的栏目中必须有数字输入的条目。检查您的原件 数据。

对于年龄,您的年龄列中有尾随空格。要么删除这些外部R,要么你可以这样做:

ddd$age <- as.numeric(sub(" +$", "", as.character(ddd$age)))

对于2000专栏,从str输出中不清楚为什么它被读作因素。默认情况下,空字符串应视为NA,因此不应影响该类。您可以尝试(假设您现在正在使用check.names = FALSE):

as.character(ddd$`2000`)[is.na(as.numeric(as.character(ddd$`2000`))) & ddd$`2000` != ""]

这应该打印出非空白和非数字的列的任何元素。它可能再次成为一个尾随空间问题。