Я пытаюсь разделить наблюдения во фрейме данных на 36 групп на основе двух непрерывных переменных. Точнее говоря, я пытаюсь разбить каждую из двух переменных на шесть групп, а затем сгруппировать наблюдения в одну из 36 различных возможных групп.
Моя попытка ниже, которая работает. Но есть ли более быстрый способ сделать это, чтобы избежать двойных циклов?
Кроме того, в этом нет необходимости, но как я могу визуализировать общее количество наблюдений в каждой группе в сетке 6 на 6? Я знаю, что table() выдаст список из 36 возможных групп и их итогов, но не в формате сетки.
set.seed(123)
x1 <- rnorm(1000)
x2 <- rnorm(1000)
data <- data.frame(x1,x2)
labs1 <- levels(cut(x1, 6))
ints1 <- cbind(lower = as.numeric(sub("\\((.+),.*", "\\1", labs1)),
upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labs1)))
labs2 <- levels(cut(x2, 6))
ints2 <- cbind(lower = as.numeric(sub("\\((.+),.*", "\\1", labs2)),
upper = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", labs2)))
tmp <- expand.grid(labs1, labs2)
groups <- cbind(lower1 = as.numeric(sub("\\((.+),.*", "\\1", tmp[,1])),
upper1 = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", tmp[,1])),
lower2 = as.numeric(sub("\\((.+),.*", "\\1", tmp[,2])),
upper2 = as.numeric(sub("[^,]*,([^]]*)\\]", "\\1", tmp[,2])))
for (i in 1:1000){
for (j in 1:36){
if (x1[i] >= groups[j,1] & x1[i] <= groups[j,2] &
x2[i] >= groups[j,3] & x2[i] <= groups[j,4]){
data$group[i] <- j
}
}
}
table()
может полностью сгенерировать вашу 2D-таблицу, 6x6 или что угодно! Это однострочный! Смотрите мой ответ ниже. (Ваша ошибка состоит в том, что вы выбросили переменную factor, возвращенную изcut()
, вместо того, чтобы использовать ее напрямую.) - person smci   schedule 12.03.2017cut()
; просто выполнитеas.vector(quantile(data$x1, probs=(0:6)/6))
, что даст-2.810 -0.995 -0.389 0.009 0.411 0.962 3.241
- person smci   schedule 12.03.2017