Отбор проб в R из вектора различной длины
У меня есть вектор с переменной длиной, который иногда может иметь длину 1.
Я хотел бы пробовать из этого вектора такой, что если его длина равна 1, она всегда производит выборку из 1 числа.
Sample () не будет делать этого, потому что он отсчитывает от 1 до цифры, когда размер выборки равен 1.
- R: gsub, pattern = vector и replacement = vector
- Ограниченная суммарная сумма?
- Как вычесть месяцы из даты в R?
- Заменить содержимое столбца факторов в R-файле
- как вы отправляете письмо от R
- Разница между `% in%` и `==`
- Как найти разницу в стоимости в каждых двух последовательных строках в R?
- Преобразование серийного номера excel DateTime в R DateTime
- Извлечь последнее слово в строке в R
- Какая польза от этого?
- R применяется с несколькими параметрами
- Перекодирование переменных с помощью R
- Возвращаемый индекс наименьшего значения в векторе?
Это документированная функция:
Если
x
имеет длину1
, являетсяnumeric
(в смыслеis.numeric
) иx >= 1
, выборка через образец происходит из1:x
. Обратите внимание, что эта удобная функция может привести к нежелательному поведению, когдаx
имеет разную длину в вызовах, таких какsample(x)
.
Альтернативой является написать свою собственную функцию, чтобы избежать этой функции:
sample.vec <- function(x, ...) x[sample(length(x), ...)] sample.vec(10) # [1] 10 sample.vec(10, 3, replace = TRUE) # [1] 10 10 10
Некоторые функции с аналогичным поведением перечислены в разделе seq vs seq_along. Когда использование seq приведет к непреднамеренным результатам?
При подаче только одного единственного числа sample
работает как sample.int
(см. ?sample
). Если вы хотите убедиться, что это только образцы из вектора, который вы ему даете, вы можете работать с индексами и использовать эту конструкцию:
x[sample(length(x))]
Это дает правильный результат независимо от длины x
и без необходимости добавлять if
-condition, проверяя длину.
Пример:
mylist <- list( a = 5, b = c(2,4), d = integer(0) ) mysample <- lapply(mylist,function(x) x[sample(length(x))]) > mysample $a [1] 5 $b [1] 2 4 $d integer(0)
Примечание: вы можете заменить sample
на sample.int
чтобы получить небольшое увеличение скорости.