Используя toString
.
df$class <- factor(apply(df[c("City", "Age_Group")], 1, toString))
levels(df$class)
# [1] "City 1, 0-9" "City 1, 10-19" "City 1, 20-29" "City 1, 30-39"
# [5] "City 1, 40-49" "City 1, 50-59" "City 1, 60-69" "City 1, 70-79"
# [9] "City 1, 80-89" "City 1, 90+" "City 10, 0-9" "City 10, 10-19"
# [13] "City 10, 20-29" [...]
Чтобы получить случайные выборки, вы можете разделить набор данных by
"class"
на подмножества, скажем s
, и вычислить, сколько групп вы получите, когда вы делите nrow(s)/20
(индивидов) на 20. Используйте ceiling
из этого, вероятно, десятичного числа, скажем, x
, и затем повторно используйте свойства R; привяжите 1:ceiling(x)
к s
, используя cbind
, и позвольте ему вернуться к nrow(s)
, где мы можем безопасно suppressWarnings
. Конечно, теперь мы хотим использовать sample
, чтобы нарушить порядок, и просто хотим столбец [,2]
. Наконец, используйте do.call(rbind(.))
, чтобы разделить набор данных, и удалите rownames
, если захотите.
set.seed(1) ## for sake of reproducibility
df <- `rownames<-`(do.call(rbind, by(df, df$class, function(s)
transform(s, SAMP=suppressWarnings(
sample(cbind(s$class, SAMP=1:ceiling(nrow(s)/20))[,2])
)))), NULL)
Результат:
Дает столбец "SAMP"
с примерно равные по размеру группы, примерно по 20 членов для каждой "class"
.
df[60:70, ] ##example rows
# ID City Age_Group class SAMP
# 60 8766 City 01 0-9 City 01, 0-9 4
# 61 8775 City 01 0-9 City 01, 0-9 1
# 62 9021 City 01 0-9 City 01, 0-9 3
# 63 9041 City 01 0-9 City 01, 0-9 3
# 64 9482 City 01 0-9 City 01, 0-9 1
# 65 9622 City 01 0-9 City 01, 0-9 1
# 66 47 City 01 10-19 City 01, 10-19 4
# 67 698 City 01 10-19 City 01, 10-19 3
# 68 833 City 01 10-19 City 01, 10-19 1
# 69 1166 City 01 10-19 City 01, 10-19 1
# 70 1221 City 01 10-19 City 01, 10-19 2
Проверьте первые десять таблиц классов с их ОБРАЗЦАМИ:
by(df$SAMP, df$class, table)[1:10]
# $`City 01, 0-9`
#
# 1 2 3 4
# 17 16 16 16
#
# $`City 01, 10-19`
#
# 1 2 3 4
# 18 17 17 17
#
# $`City 01, 20-29`
#
# 1 2 3 4
# 18 18 17 17
#
# $`City 01, 30-39`
#
# 1 2 3 4
# 19 19 19 19
#
# $`City 01, 40-49`
#
# 1 2 3 4
# 19 19 19 18
#
# $`City 01, 50-59`
#
# 1 2 3 4 5
# 18 17 17 17 17
#
# $`City 01, 60-69`
#
# 1 2 3 4
# 16 16 16 16
#
# $`City 01, 70-79`
#
# 1 2 3 4
# 19 19 19 19
#
# $`City 01, 80-89`
#
# 1 2 3 4
# 20 19 19 19
#
# $`City 01, 90+`
#
# 1 2 3 4
# 18 17 17 17
Случай вам нужна нумерация по классам, а не все вместе, просто paste
"class"
(как numeri c) и "SAMP"
вместе.
df <- transform(df, SAMP2=paste(as.numeric(class), SAMP, sep="."))
head(df)
# ID City Age_Group class SAMP SAMP2
# 1 193 City 01 0-9 City 01, 0-9 3 1.3
# 2 480 City 01 0-9 City 01, 0-9 1 1.1
# 3 742 City 01 0-9 City 01, 0-9 2 1.2
# 4 757 City 01 0-9 City 01, 0-9 1 1.1
# 5 811 City 01 0-9 City 01, 0-9 3 1.3
# 6 870 City 01 0-9 City 01, 0-9 3 1.3