Образец из разных столбцов в R - PullRequest
0 голосов
/ 05 июля 2018

У меня есть вектор вероятностей, скажем,

prob=c(0.1,0.8,0.1)

и датафрейм: df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))

и я хочу выбрать n объект из df с заменой, с вероятностью 0,1 из первого столбца, 0,8 из второго и 0,1 из третьего

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Это основано на предположении, что выборочные вероятности в пределах одного столбца одинаковы:

Сначала мы выбираем n позиций столбцов, используя вероятности в векторе prob;

df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))
prob=c(0.1,0.8,0.1)
n = 10

set.seed(1)
colselect <- sample(1:ncol(df), size = n, replace = TRUE, prob = prob)

[1] 2 2 2 1 2 3 1 2 2 2

Затем мы перебираем позиции столбцов и выбираем по одному элементу из каждого столбца:

sapply(colselect, function(x) sample(df[,x], 1))

[1] "1" "1" "3" "B" "3" "v" "A" "3" "2" "3"
0 голосов
/ 05 июля 2018

Мы удалим data.frame и изменим наш вектор prob на лету, чтобы он имел соответствующую длину.

df <- data.frame(c("A","B","A"), c(1,2,3), c("q","v","z"), stringsAsFactors = F)

n <- 5
set.seed(1)
unname(sample(unlist(df), n, replace = TRUE, prob= rep(prob, each = nrow(df))))
# [1] "3" "1" "A" "z" "2"

Если вы действительно начинаете с матрицы, а не с data.frame, это немного короче:

df=cbind(c("A","B","A"),c(1,2,3),c("q","v","z"))
set.seed(1)
sample(df, n, replace = TRUE, prob= rep(prob, each = nrow(df)))
# [1] "3" "1" "A" "z" "2"

Из списка (отвечая на комментарии)

l =list(c("A","B"),c(1,2,3),c("q","v","z","w"))
set.seed(1)
sample(unlist(l), n, replace = TRUE, prob= rep(prob/lengths(l), lengths(l)))
# [1] "3" "2" "1" "v" "3" "B" "q"
...