按因子对数据进行二分法

时间:2013-05-14 17:03:30

标签: r median r-factor categorization

我需要根据两个因素创建一个dichtomized变量(一个希望它是可能的)。

假设我有数据:

    d <- data.frame ( 
    agegroup = c(2,1,1,2,3,2,1,3,3,3,3,3,1,1,2,3,2,1,1,2,1,2,2,3) ,
    gender = c(2,2,2,2,2,2,1,2,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1,1) , 
    hourwalking = c(0.3,0.5,1.1,1.1,1.1,1.2,1.2,1.2,1.3,1.5,1.7,1.8,2.1,2.1,2.2,2.2,2.3,2.4,2.4,3,3.1,3.1,4.3,5)        
    )

我想使用性别和年龄组特定的中位数创建二进制(LowWalkHrs)(例如,当agegroup = 1且gender = 1,median = 2.1(使用excel找到中位数))。 LowWalkHrs将是数据集中的附加变量,因此输出将为:

     agegroup gender hourwalk LowWalkHrs
        2       2       0.3       1
        1       2       0.5       1
        1       2       1.1       0
        2       2       1.1       1
        3       2       1.1       1
        2       2       1.2       0
        1       1       1.2       1
          ....
        3       1       5         0

我有一个相当大的数据集(~10k观测值),所以Excel是不可能的。

在R中我尝试过cut和cut2,它似乎没有采用因子变量,以及ddply,这给了我一个错误信息($<-.data.frame中的错误(*tmp*) lowWalkHrs“,value = list(hourwalking = c(0.63,:替换有949行,数据有11303)。

2 个答案:

答案 0 :(得分:2)

我怀疑这可能会很慢,但我认为它有效:

z <- mapply(d$agegroup, d$gender, d$hourwalking, FUN=function(a,g,h)
    as.numeric(h < median(d$hourwalking[d$agegroup==a & d$gender==g])) )

答案 1 :(得分:2)

d <- data.frame ( 
    agegroup = c(2,1,1,2,3,2,1,3,3,3,3,3,1,1,2,3,2,1,1,2,1,2,2,3) ,
    gender = c(2,2,2,2,2,2,1,2,1,1,1,2,1,1,2,2,1,1,1,1,2,1,1,1) , 
    hourwalking = c(0.3,0.5,1.1,1.1,1.1,1.2,1.2,1.2,1.3,1.5,1.7,1.8,2.1,2.1,2.2,2.2,2.3,2.4,2.4,3,3.1,3.1,4.3,5)        
   )

d$LowWalkHrs=1*with(d,hourwalking<ave(hourwalking,list(factor(agegroup,exclude=NULL),factor(gender,exclude=NULL)),FUN=median))
添加

因子(...,exclude = NULL)以将NA作为单独的组进行处理。