Установка начального числа для воспроизводимых случайных данных:
set.seed(2)
my.matrix <- as.data.frame(matrix(rbinom(100 * 1000, 1, 0.5), ncol = 100, nrow = 1000))
Функции типа apply
и rowSums
преобразуют данные в matrix
.Если таковые имеются, если у вас есть включенные столбцы character
, то все будет преобразовано, и все может работать не так, как вы хотели бы.Использование isnum
просто для того, чтобы убедиться, что вы случайно не включили его (даже если в этом фактическом примере данных нет ничего неправильного):
isnum <- sapply(my.matrix, is.numeric)
sums <- rowSums(my.matrix[,isnum] != 0)
head(sums)
# [1] 51 60 53 45 42 56
table(sums)
# sums
# 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
# 2 2 1 7 11 20 21 37 36 49 46 64 72 71 59 79 72 77 76 52 48 33 21 14 11 10
# 62 63 64 70
# 1 5 2 1
Отсюда просто установите поднабор диапазона вручную.
my.matrix[ 37 < sums & sums < 40, 1:4 ]
# V1 V2 V3 V4
# 69 0 0 1 1
# 202 1 0 0 1
# 228 0 1 0 0
# 293 1 0 1 0
# 306 0 1 0 0
# 363 0 1 1 0
# 810 0 0 1 1
# 890 1 0 1 1
Вы также можете использовать dplyr::between
или data.table::between
для более краткого кода, хотя он не добавляет никаких возможностей по этому поводу.
Что касается выборки, то это прямая выборка один разу вас есть эта информация:
ind <- which(37 < sums & sums < 40)
ind <- sample(ind, min(length(ind), 100))
my.matrix[ ind, 1:4 ]
# V1 V2 V3 V4
# 363 0 1 1 0
# 202 1 0 0 1
# 228 0 1 0 0
# 890 1 0 1 1
# 306 0 1 0 0
# 69 0 0 1 1
# 810 0 0 1 1
# 293 1 0 1 0
Я сделал max(...)
на случай, если у вас будет меньше , чем 100 в вашем результирующем векторе.Без max
вы можете увидеть cannot take a sample larger than the population when 'replace = FALSE'
.