Сделайте определенные строки в R отсутствующими с вероятностью x - PullRequest
1 голос
/ 24 октября 2019

Я хочу, чтобы определенное количество строк отсутствовало с вероятностью «X».

Например, взять набор данных iris и добавить к нему новый столбец со значениями от 0 до 1.

data(iris)

iris <- iris %>% mutate(ind = runif(n = nrow(iris), 0, 1))

Тогда для каждой строки должна отсутствовать каждая из оставшихся переменных Sepal.Width, Sepal.Length, Petal.Width, Petal.Length, Species с вероятностью, соответствующей этому новому столбцу ind

Например, скажем, у нас есть

set.seed(99)
data(iris)
iris <- iris %>% mutate(ind = runif(n = nrow(iris), 0, 1))

, мы получаем такую ​​таблицу

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species         ind
1            5.1         3.5          1.4         0.2     setosa 0.802761295
2            4.9         3.0          1.4         0.2     setosa 0.230139103
3            4.7         3.2          1.3         0.2     setosa 0.665336609

Затем после запуска кода - в первой строке Sepal.LengthNA с вероятностью 0,802761295. Тогда Sepal.Width отсутствует с этой вероятностью, ..., затем Вид отсутствует с вероятностью 0,802761295.

Для второй строки Sepal.Length отсутствует с вероятностью 0,230139103.

И такдалее.

Я пытался использовать цикл for и оператор if для выполнения этого, но не могу не чувствовать, что есть более эффективный путь продвижения вперед. Любая помощь в правильном направлении будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 24 октября 2019

Вы можете использовать apply для циклического перемещения по строкам (или любому измерению) соответствующих структур данных (data.frame, matrix и т. Д.).

library(dplyr)
set.seed(99)
data(iris)
iris <- iris %>% 
  mutate(ind = runif(n = nrow(iris), 0, 1)) 
res <- data.frame(t(apply(iris, 1, FUN = function(x) {
  x[which(runif(5) < x[6])] = NA
  x
})))
head(res)
#>   Sepal.Length Sepal.Width Petal.Length Petal.Width Species         ind
#> 1         <NA>        <NA>          1.4         0.2  setosa 0.584711852
#> 2          4.9         3.0          1.4         0.2  setosa 0.113781675
#> 3         <NA>         3.2         <NA>        <NA>    <NA> 0.684264744
#> 4         <NA>        <NA>         <NA>        <NA>    <NA> 0.992508777
#> 5          5.0         3.6         <NA>        <NA>  setosa 0.534993585
#> 6         <NA>        <NA>         <NA>        <NA>    <NA> 0.966614064

Создано в 2019-10-24 с помощью представительного пакета (v0.3.0)

0 голосов
/ 24 октября 2019
iris[,1:5][matrix(runif(nrow(iris)*5), ncol = 5) < iris$ind] <- NA

Генерирует матрицу из равномерно распределенных случайных чисел измерения nrow (радужка) x 5 и сравнивает ее с iris$ind (элементы вектора iris$ind рециркулируются при сравнении). Элементы iris, соответствующие значениям ниже iris$ind, затем устанавливаются на NA.

# > head(iris)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species        ind
# 1           NA          NA          1.4         0.2  setosa 0.58471185
# 2          4.9         3.0          1.4         0.2  setosa 0.11378168
# 3          4.7          NA           NA          NA  setosa 0.68426474
# 4           NA          NA           NA          NA    <NA> 0.99250878
# 5          5.0         3.6           NA          NA  setosa 0.53499358
# 6           NA          NA           NA          NA    <NA> 0.96661406
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...