Как в R назначить квантили для разных факторов?

Существует множество советов о том, как вычислять квантили для столбца данных, но я пытаюсь пометить каждую точку данных, к какому квантилю она принадлежит, основываясь на каком-то другом поле.

Супер простой пример:

pink<-data.frame(matrix(rnorm(20),nrow=100))
pink$color<-c("pink")
red<-data.frame(matrix(rnorm(50),nrow=100))
red$color<-c("red")
names(red)[names(red)=="matrix.rnorm.50...nrow...100."]<-"value"
names(pink)[names(pink)=="matrix.rnorm.20...nrow...100."]<-"value"
mydata<-rbind(red,pink)

Итак, представьте, что все, что у меня есть, это фрейм данных mydata. Мне нужен новый столбец, который присваивает каждой строке квантиль на основе значения $ для цвета $. В приведенном выше случае строка со значением 0,7 будет в верхнем квартиле для розового цвета, но не для красного.

Как мне сделать такой «квантиль по группе/фактору»? Спасибо за любую помощь!


person Tyler Schnoebelen    schedule 02.10.2014    source источник
comment
Несмотря на то, что вы получили три ответа, я нахожу этот вопрос бессвязным. Возможно, вы хотите определить квартили? Если это так, вы должны отредактировать вопрос, чтобы прояснить это. Квантиль и квартиль - это не одно и то же.   -  person IRTFM    schedule 03.10.2014


Ответы (3)


Вы можете использовать cut для получения значений quantile, а также пометить их

newData <- lapply(split(mydata, mydata$color), function(x) {
    x$key <- with(x, cut(value, quantile(value), 
                  labels = 1:4, include.lowest = TRUE))
    x
})
lapply(newData, head)
# $pink
#           value color key
# 101 -1.10353351  pink   1
# 102  0.90278706  pink   4
# 103  0.06831835  pink   3
# 104 -1.14946795  pink   1
# 105 -0.90127498  pink   2
# 106 -1.19845352  pink   1
# 
# $red
#         value color key
# 1 -0.04827783   red   3
# 2  0.28444148   red   3
# 3 -2.34491308   red   1
# 4  0.35213987   red   4
# 5 -0.73670929   red   2
# 6  0.15286555   red   3

Затем do.call(rbind, newData), чтобы вернуть их вместе.

person Rich Scriven    schedule 03.10.2014

Решение с пакетом data.table:

    require(data.table)
    dt<-as.data.table(mydata)
    dt[,list(value,color,findInterval(value,quantile(value,c(.25,.50,.75)))),by=color]
person nicola    schedule 02.10.2014
comment
можно немного упростить код: dt[,list(value,findInterval(value,quantile(value,c(.25,.50,.75)))),by=color] - person KFB; 03.10.2014

Попробуйте функцию ave:

> mydata$block= with(mydata, ave(value, color, 
           FUN=function(x)findInterval(x,quantile(x,c(.25,.50,.75))) ))
> head(mydata)
       value color block
1  1.6147642   red     3
2 -0.2315269   red     2
3 -0.6822261   red     1
4 -0.6143924   red     1
5  1.5840925   red     3
6 -0.8477495   red     0
person rnso    schedule 03.10.2014