2014-10-21 59 views
0

我有一个距离变量(以米为单位)来自特定源的属性,通过QGIS在我的数据子集中创建。虚拟变量代码R中的间隔

我想创建虚拟间隔与R如下:

0-100,101-200,201-300,301-400 & 401-500

我已经编码为以包括以下任何间隔内的所有属性:

data$Distance_100<-0 
data$Distance_100[data$Distance<100]<-1 

data$Distance_200<-0 
data$Distance_200[data$Distance>=101&data$Distance<200]<-1 

data$Distance_300<-0 
data$Distance_300[data$Distance>=201&data$Distance<300]<-1 

data$Distance_400<-0 
data$Distance_400[data$Distance>=301&data$Distance<400]<-1 

data$Distance_500<-0 
data$Distance_500[data$Distance>=401&data$Distance<500]<-1 

似乎在编码方面有问题。它不会将所有属性放在间隔中,看起来正确的编码。有什么建议做什么?

+0

除了迄今为止的有用答案外,请查看'findInterval',并在SO上发布问题前学习搜索。 – 2014-10-21 23:20:03

回答

2

使用cut函数来创建一个单一分类变量的时间间隔:

data$DistanceCut5 = cut(data$Distance, breaks=c(0,100,200,300,400,500)) 

如果你正在做回归,你不需要代码中分离虚拟变量。如果您将DistanceCut5输入到回归公式中,R将为您处理该问题。

而且,看看在帮助cut所以你可以看到如何改变类别标签(使用labels参数)以及如何确定区间的左侧或右侧是否关闭(使用right参数)。

此外,如果Distance的任何值大于500,cut会将类别标签设置为NA(缺失)。如果要确保Distance的所有值都具有DistanceCut5中的类别值,请确保levels的最低值和最高值之间的范围包含Distance中的所有值。

另外一种风格的评论:data实际上是R中的一个函数,所以最好不要养成将它用作数据框名称的习惯。

+0

'model.matrix(〜DistanceCut5 + 0,data = data)'然后会根据需要给你分开的列。 – thelatemail 2014-10-21 23:14:30

+0

谢谢@ eipi10!只有一个(愚蠢的)问题。 0-100的区间似乎不被估计?只是 DistanceCut(100,200] DistanceCut(200,300]等,所以是101-200 201-300?所以也没有重叠。 非常感谢! – Karl 2014-10-21 23:46:33

+0

你的意思是你的数据帧开始或者是这个回归分析的结果?如果是后者,那么'(0,100]'是基本类别,其他类别系数是相对于基本类别。这就像传统的虚拟编码一样。想要在回归中加入拦截 – eipi10 2014-10-21 23:49:49