2011-10-31 67 views
3

道歉是这是一个更经验丰富的R用户会知道,但我只是碰到这个问题,想问一下正确的用法。使用as.factor而不是plyr和ddply来对R中的变量进行分组?

似乎有可能通过使用as.factor来分类变量的范围。所以,我可以将观察分成一个范围。例如,如果我正在查看用户的访问,则看起来我可以编写if/then语句来按用户的访问范围对用户进行分类,然后根据组获得摘要统计信息。

这里就是我得知这个链接:http://programming-r-pro-bro.blogspot.com/2011/10/modelling-with-r-part-2.html

现在,虽然这个功能看起来比使用plyrddply分组数据更容易,它看起来并不足够强大到变量打入X号的箱子(例如十分之一) - 你必须自己做。

这导致了我的问题 - 对于分组数据,其中一个比另一个更好吗,还是有很多方法可以解决这样的分组问题?

感谢

+2

'as.factor'只是简单地将一个字符向量转换成一个因子 - 它本身不做任何分析。 'ddply'是'plyr'提供的套件中的强大工具之一。比较'as.factor'和'ddply'有点像比较球轴承和变速箱。 – Andrie

+2

你可能想看看''cut'。你可能也想看看http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example通过一个你想要做的小例子,人们会更多轻松插入,并向您展示一些更简单的方法来做到这一点。 'cut()'就是其中之一。 –

+1

对不起@Joris,我真的应该让人们在回答之前改进他们的问题。 – Aaron

回答

8

我觉得cut是这更好的工具。

有了一些样本数据:

set.seed(123) 
age <- round(runif(10,20,50)) 

这是我会怎么做:

> cut(age, c(0,30,40,Inf)) 
[1] (0,30] (40,Inf] (30,40] (40,Inf] (40,Inf] (0,30] (30,40] (40,Inf] 
[9] (30,40] (30,40] 
Levels: (0,30] (30,40] (40,Inf] 

可选,手动设定因素标签:

> cut(age, c(0,30,40,Inf), labels=c('0-30', '31-40', '40+')) 
[1] 0-30 40+ 31-40 40+ 40+ 0-30 31-40 40+ 31-40 31-40 
Levels: 0-30 31-40 40+ 

要相比之下,链接页面暗示了这一点:

> as.factor(ifelse(age<=30, '0-30', ifelse(age <= 40, '30-40', '40+'))) 
[1] 0-30 40+ 30-40 40+ 40+ 0-30 30-40 40+ 30-40 30-40 
Levels: 0-30 30-40 40+ 
+1

'cut'肯定比链接页面中说明的ifelse方法更好。注意'cut'的include.lowest参数。 –

+0

感谢您的建议。我明白为什么这可能是更好的方法来处理它。 – mikebmassey

相关问题