Как я могу определить, к какой группе факторов принадлежит значение? - PullRequest
4 голосов
/ 09 августа 2011

Я использую функцию cut, чтобы разделить мои данные на группы, используя диапазон макс / мин.Вот пример кода, который я использую:

# sample data frame - used to identify intial groups
testdf <- data.frame(a = c(1:100), b = rnorm(100))

# split into groups based on ranges 
k <- 20 # number of groups
# split into groups, keep code
testdf$groupCode <- cut(testdf$b, breaks = k, labels = FALSE)
# store factor information 
testdf$group <- cut(testdf$b, breaks = k)                     
head(testdf)

Я хочу использовать идентифицированные группировки факторов, чтобы разделить другой кадр данных, но я не уверен, как использовать факторы, чтобы справиться с этим,Я думаю, что моя структура кода должна быть примерно такой:

# this is the data I want to categorize based on previous groupings
datadf <- data.frame(a = c(1:100), b = rnorm(100))
datadf$groupCode <- function(x){return(groupCode)}

Я вижу, что данные фактора имеют следующую структуру, но я не знаю, как правильно их использовать:

testdf$group[0]
factor(0)
20 Levels: (-2.15,-1.91] (-1.91,-1.67] (-1.67,-1.44] (-1.44,-1.2]  ... (2.34,2.58]

Две функции, с которыми я экспериментировал (но которые не работают):

# get group code 
nearestCode <- function( number, groups ){
  return( which( abs( groups-number )== min( abs(groups-number) ) ) )  
}
nearestCode(7, testdf$group[0])

А также экспериментировали с функцией which.

which(7, testdf$group[0])

Каков наилучший способ идентификации групп и применения их к другому фрейму данных?

Ответы [ 2 ]

7 голосов
/ 09 августа 2011

Я бы использовал:

testdf$groupCode <- cut(testdf$b, breaks = 
                           quantile(testdf$b, seq(0,1, by=0.05), na.rm=TRUE))
grpbrks <- quantile(testdf$b, seq(0,1, by=0.05), na.rm=TRUE)

Тогда вы можете использовать:

 findInterval(newdat$newvar, grpbrks)   # to group new data

И тогда вам не нужно будет разбираться с восстановлением разрывов на этикетках илиданные.

Думая о, я думаю, вы также можете использовать:

 cut(newdat$newvar, grpbrks)  # more isomorphic to original categorization I suppose
2 голосов
/ 09 августа 2011

Свертывание с некоторыми регулярными выражениями, кажется, единственный способ фактически вернуть значение объекта, полученного в результате cut.

Следующий код выполняет необходимые привинчивания:

cut_breaks <- function(x){
  first <- as.numeric(gsub(".{1}(.+),.*", "\\1", levels(x))[1])
  other <- as.numeric(gsub(".+,(.*).{1}", "\\1", levels(x)))
  c(first, other)
}

set.seed(1)
x <- rnorm(100)

cut1 <- cut(x, breaks=20)
cut_breaks(cut1)
 [1] -2.2200 -1.9900 -1.7600 -1.5300 -1.2900 -1.0600 -0.8320 -0.6000 -0.3690
[10] -0.1380  0.0935  0.3250  0.5560  0.7870  1.0200  1.2500  1.4800  1.7100
[19]  1.9400  2.1700  2.4100

levels(cut1)
 [1] "(-2.22,-1.99]"   "(-1.99,-1.76]"   "(-1.76,-1.53]"   "(-1.53,-1.29]"  
 [5] "(-1.29,-1.06]"   "(-1.06,-0.832]"  "(-0.832,-0.6]"   "(-0.6,-0.369]"  
 [9] "(-0.369,-0.138]" "(-0.138,0.0935]" "(0.0935,0.325]"  "(0.325,0.556]"  
[13] "(0.556,0.787]"   "(0.787,1.02]"    "(1.02,1.25]"     "(1.25,1.48]"    
[17] "(1.48,1.71]"     "(1.71,1.94]"     "(1.94,2.17]"     "(2.17,2.41]"    

Затем вы можете передать эти значения разрыва в cut, используя параметр breaks=, чтобы сделать ваш второй разрез.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...