我有一个大的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 +
答案 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` != ""]
这应该打印出非空白和非数字的列的任何元素。它可能再次成为一个尾随空间问题。