如何阅读因子';在R中正确的级别?

如何阅读因子';在R中正确的级别?,r,csv,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

我有一个很大的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级的系数,应该被解读为“整数”。为什么R用这么多的水平来解读可观察的“性别”,为什么它把2000年作为一个因素来解读,而把其他的解读为int(事实就是这样)

编辑:
“年龄”列的值的形式为:20-24、25-30、。。。直到85-90岁。另一个类别90+

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

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


性别变量很奇怪,考虑到当前可用的数据,我想说该变量至少在数据集的一部分中代表了性别以外的东西。数据集是否缝合在一起?可能是复制/粘贴时出错。请参阅
级别(ddd$Sex)
将所有可能的级别分开。

读取.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)))

这应该打印出列中任何非空和非数字的元素。这可能也是一个尾随空格问题。

显然,“sex”可以是空的(“”、0、1、10…),对于“X2000”,也可以是空的(“”),即一个字符与整数混合在一起。use
read.csv(…,stringsAsFactors=F)
如果需要的话,可以避免使用因子变量。另外,我认为在R中,不能有一个带有数字名称的列,所以R将X转换为character@AndriyTkachenko你可以。列可以被称为任何你喜欢的东西,甚至
2+2
。见下面我的答案。我用cat来“缝合”大文件是:
cat file2.csv>>file1.csv
,然后是
cat file3>>file1
,用于我所有的5个csv文件。我再次检查了该文件,发现我更正的性列中有一些错误。现在就这些,谢谢。它们在所有方面都完全相同吗,@FaizLotfy?@FaizLotfy请检查是否有错误在列中y移位,如果这对应于任何文件。我这样做了。除了内容外,它们是相同的。生成大文件后,我注意到以下内容:在年龄列中,单词“年”在列中的每个数字之后。这导致了失真。我再次生成了大文件,但这次我手动生成了,我复制了每个文件,并将其粘贴到在LibreOffice中打开的csv文件中的上一个文件的下方。在保存文件之前,我搜索“年”一词保存文件并再次打开后,我注意到失真消失了。@FaizLotfy告诉过你。:)我尝试了check.names=F,结果成功了。我将不得不使用反引号这一事实使我(目前)坚持使用X2000格式。我的其他问题是由原始数据文件中的一些错误引起的(如您所建议的)。谢谢
as.character(ddd$`2000`)[is.na(as.numeric(as.character(ddd$`2000`))) & ddd$`2000` != ""]